【问题标题】:SQLSTATE[HY093]: Invalid parameter number [duplicate]SQLSTATE [HY093]:无效的参数号[重复]
【发布时间】:2014-06-29 06:18:50
【问题描述】:

我在使搜索查询正常工作时遇到了一些问题。我得到这个错误。

SQLSTATE[HY093]: 参数号无效

这是我的代码。

<?php
try{
    $sql = "SELECT * FROM `character` WHERE `name` LIKE :search  OR `play` LIKE :search";
    $query = $db->prepare($sql); 
    $query->execute(array(':search' => strip_tags($_POST['search'])));
    $result = $query->fetchAll(PDO::FETCH_ASSOC);
    foreach($result as $row){
            $name = $row['name'];
            $gender = $row['gender'];
            $id = $row['id'];
            echo "<tr>
            <td>". $name ."</td>
            <td>". $gender ."</td>
                <td><a href='characterbio.php?id=". $id ."'>". $name ."'s Bio Page</a></td>
                </tr>";
    }
}catch(PDOException $e){
     die($e->getMessage());
}
?>

请帮帮我。谢谢!

【问题讨论】:

  • 可能想在LIKE 条件周围添加一些通配符,例如field LIKE CONCAT('%', :param, '%')。此外,strip_tags() 在您使用的上下文中几乎没有意义。

标签: php mysql sql pdo


【解决方案1】:

根据PDO::Prepare

您必须为希望添加的每个值添加一个唯一的参数标记 调用 PDOStatement::execute() 时传入语句。你 不能多次使用同名的命名参数标记 一个准备好的语句,除非仿真模式开启。

所以要么打开仿真模式

$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, TRUE);

或改为-

$sql = "SELECT * FROM `character` WHERE `name` LIKE :search1  OR `play` LIKE :search2";
$query = $db->prepare($sql); 
$query->execute(array(':search1' => strip_tags($_POST['search']),':search2' => strip_tags($_POST['search'])));

此外,由于您在查询中使用 LIKE,因此您需要将通配符 % 添加到您的值中

$query->execute(array(':search1' => "%".strip_tags($_POST['search'])."%",':search2' => "%".strip_tags($_POST['search'])."%"));

【讨论】:

    猜你喜欢
    • 2023-01-09
    • 2021-06-18
    • 1970-01-01
    • 2016-03-04
    • 2019-09-28
    • 1970-01-01
    • 2017-06-10
    • 2013-08-04
    • 2016-12-04
    相关资源
    最近更新 更多