2014-04-04 103 views
-1

我有一个无效的参数错误,但我想我有正确的编号参数。无效的参数编号错误

有没有人在这里看到相反的?

林收到这个错误:

PDOStatement对象::执行():SQLSTATE [HY093]:无效参数号:绑定变量的数目不$ readNews-匹配的令牌数>执行();

if(isset($_POST['search'])) 
    { 
    $search = $_POST['search']; 
    $readNews = $pdo->prepare("SELECT * FROM news WHERE title LIKE ? ORDER BY date DESC LIMIT ?, ?"); 
    $readNews->bindValue(1, $search); 
    $readNews->bindValue(1, $begin,PDO::PARAM_INT); 
    $readNews->bindValue(2, $max,PDO::PARAM_INT); 
    } 
    else 
    { 
    $readNews = $pdo->prepare("SELECT * FROM news ORDER BY date DESC LIMIT ?, ?"); 
    $readNews->bindValue(1, $begin,PDO::PARAM_INT); 
    $readNews->bindValue(2, $max,PDO::PARAM_INT); 
    } 

    $readNews->execute(); 
+1

不要使用'和'用逗号'SELECT * FROM新闻,标题LIKE' –

+0

但标题不是表,标题是一个专栏中,我想选择*来自新闻的标题,如$搜索! – John23

+0

您可能打算使用'WHERE'作为Phil在下面发布。我早些时候看到了[你的其他问题](http://stackoverflow.com/q/22851219/),这让我很难理解它。我知道我是对的。 –

回答

2

您有三个参数,但您可以为索引1指定一个值两次。试试这个...

$readNews->bindValue(1, $search); 
$readNews->bindValue(2, $begin,PDO::PARAM_INT); 
$readNews->bindValue(3, $max,PDO::PARAM_INT); 

我猜你可能要环绕$search值一些通配符了。试试这个...

$readNews->bindValue(1, "%$search%"); 

...或者在查询中使用CONCAT ...

WHERE title LIKE CONCAT('%', ?, '%') 

您的查询也应该使用WHERE代替AND ...

SELECT * FROM news WHERE title LIKE ? ORDER BY date DESC LIMIT ?, ?" 

我可能会简化这个通过使用命名占位符删除一些重复。总的来说,这个...

if (isset($_POST['search'])) { 
    $stmt = $pdo->prepare("SELECT * FROM news WHERE title LIKE CONCAT('%', :search, '%') ORDER BY date DESC LIMIT :begin, :max"); 
    $stmt->bindParam(':search', $_POST['search']); 
} else { 
    $stmt = $pdo->prepare('SELECT * FROM news ORDER BY date DESC LIMIT :begin, :max'); 
} 
$stmt->bindParam(':begin', $begin, PDO::PARAM_INT); 
$stmt->bindParam(':max', $max, PDO::PARAM_INT); 
$stmt->execute(); 
+0

谢谢你工作:) – John23

+0

顺便说一句,你认为这种方法是一个很好的解决方案?因为它似乎有点业余,因为代码重复。这里有一个小时的问题,现在我想这个解决方案,它的工作原理,但我再次,我不知道这是否是一个正确的方法.. – John23

+0

@ John23我最近的更新已经删除了重复 – Phil