PHP 绑定通配符

Posted

技术标签:

【中文标题】PHP 绑定通配符【英文标题】:PHP Binding a Wildcard 【发布时间】:2013-01-30 02:09:16 【问题描述】:

当多字符通配符需要在变量值旁边时,希望有人能帮助我了解如何在 mysqli 中绑定参数。我发现它在创建 SQL 语句时对我有用,如下所示:

$sql = "SELECT item_title FROM item WHERE item_title LIKE '%$title%'";

但是,我尝试按照相同的模式绑定变量,发现它失败了。他们使用了这个代码:

$sql = "SELECT item_title FROM item WHERE item_title LIKE '%?%'";

它引发了这个错误:

警告:mysqli_stmt_bind_param() [function.mysqli-stmt-bind-param]: 变量数与准备好的参数数不匹配 在线program_name中的语句......

谁能告诉我如何解决这个问题? 谢谢你。

【问题讨论】:

尝试LIKE ? 然后bind_param("%".$string."%")LIKE '%' || ? || '%' 【参考方案1】:

每个绑定变量有一个问号。 例如 prepare(SELECT item_title FROM item WHERE item_title LIKE ? and name2 like ? and ...) 准备好的语句的好处是您不必担心引用变量。

然后绑定所有参数,如 bind_param("ss...", $param1, $param2, ....);

【讨论】:

【参考方案2】:
   $sql="SELECT item_title FROM item WHERE item_title LIKE concat ('%',?,'%') ";

【讨论】:

【参考方案3】:

你可以这样做:

$sql = "SELECT item_title FROM item WHERE item_title LIKE ? ";

然后

$title_new =  '%'.$title.'%';
mysqli_stmt_bind_param($stmt, 's', $title_new);    

根据用户评论更新

下面的SQL实现

 s2.subject_name LIKE '%$keyword%' OR c.city_name LIKE '%$keyword%' 

下面使用MySqli语句 s2.subject_name 喜欢吗?或 c.city_name LIKE ?

 $keyword = '%'.$keyword.'%';
 mysqli_stmt_bind_param($stmt, 'ss', $keyword, $keyword);

【讨论】:

【参考方案4】:

您只能绑定数据文字,不能绑定任意查询部分。 所以,首先准备你的文字

$var = "%$var%";
$sql = "SELECT item_title FROM item WHERE item_title LIKE ?";

【讨论】:

感谢您的回复。我在查询的 where 子句中使用了相同的变量两次,就像这样 - WHERE (s2.subject_name LIKE '%$keyword%' OR c.city_name LIKE '%$keyword%' )。那你能告诉我我是怎么绑定这个变量的吗? @TharangaNuwan 我已经根据您的 cmets 更新了答案,见下文 这不会留下安全漏洞。特别是如果 $var = 'hello%world' 你有一个意外的占位符标记。

以上是关于PHP 绑定通配符的主要内容,如果未能解决你的问题,请参考以下文章

带有通配符的 MySQLi 准备语句的奇怪结果(程序)

在 Ruby 中将 UDP 套接字绑定到通配符主机

oracle = : := 和变量绑定 oracle通配符和运算符

Polymer 1.0 通配符绑定到数组中的嵌套子属性

为啥 HttpListener 在侦听强通配符 (http://+:port) http.sys/urlacl 绑定时“与现有注册冲突”?

Windows Ubuntu Bash申请免费通配符证书(Let's Encrypt)并绑定IIS