【问题标题】:Mysqli Prepared Statement with % wildcard带有 % 通配符的 Mysqli Prepared Statement
【发布时间】:2017-06-15 15:28:20
【问题描述】:

我正在尝试构建一个动态准备语句,以便我可以重用代码。在使用 LIKE 的准备状态下使用 %?% 时,我遇到了问题。我的代码如下:

$where = " First_Name LIKE '%?%' ";
$vals = array('Mike');
$type = 's';

$dbd = mysqli_stmt_init($dbconnection);
if (mysqli_stmt_prepare($dbd, "SELECT * FROM Contacts WHERE $where" )) {
mysqli_stmt_bind_param($dbd, $type, ...$vals);
if (!mysqli_stmt_execute($dbd)) {
echo "Execute Error: " . mysqli_error($dbconnection);
        } else {
            //do nothing
        }
    } else {
        echo "Prep Error: " . mysqli_error($dbconnection);
    }
mysqli_stmt_get_result($dbd);

所以当我使用“First_Name = ?”它工作正常,所以我认为我的问题与'%?%'有关。我已经搜索了解决方案,但找不到与我的动态准备语句相关的任何内容。感谢您的帮助。

【问题讨论】:

  • 注意:mysqli 的面向对象接口明显不那么冗长,使代码更易于阅读和审核,并且不容易与过时的mysql_query 接口混淆。在您对程序风格投入过多之前,值得转换一下。
  • @tadman:你错过了prepare()bind_param()???
  • @AbraCadaver 是的,我想我这样做了,因为这是一种非常不寻常的绑定方式。很好的收获。
  • 我对准备好的语句很陌生,所以感谢您的反馈。我在上面使用了 mysqli_stmt_prepare 和 mysqli_stmt_bind_param。这不正确吗?
  • PDO 手册的示例 6 将向您展示您失败的地方,php.net/manual/en/pdo.prepared-statements.php(我发现 mysqli 手册缺少很多信息)。简而言之,占位符需要独立存在。

标签: php mysql mysqli wildcard sql-like


【解决方案1】:

您需要绑定完整的值,而不仅仅是其中的一部分。这意味着:

$where = "First_Name LIKE ?"

然后绑定:

$vals = array('%Mike%');

【讨论】:

  • 非常感谢您对我的问题的直截了当的回答,而不是对其他所有问题的所有批评。该代码现在按预期工作并带回正确的结果。既然我有了答案(谢谢),我欢迎批评,因为我确实想编写好的安全代码。
  • 使用占位符值是一个很好的起点,因此您在此处处于正确的轨道上。如果您希望在编写查询时获得更大的灵活性,或者甚至从编写它们的任务中获得一些抽象,那么像 DoctrinePropelEloquent 这样的良好 ORM 可以提供帮助。 PHP the Right Way 也是一个很好的 PHP 通用生存指南。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-26
相关资源
最近更新 更多