php - 为什么准备好的语句中的计算 'like' 子句需要括号?

标签 php mysql prepared-statement sql-like

我想在 PHP 中的准备好的语句中添加一个类似于以下第一行的子句,以便在 MySQL 中运行:

$sql .= " where ? like '%'+name+'%' ";

if ($stmt = mysqli_prepare($con, $sql)) {    
//irrelevant code omitted here.
} else {
    echo("Error description: " . mysqli_error($con));
}

其中 name 是表中的列,而 ?是要绑定(bind)的参数。

我收到此错误:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '+name+'%' at line 1

如果我将 ? 替换为“fred”并在 MySQL 工作台中运行它它将运行。同样,如果我只是删除串联以便它开始 $sql .= "where ? like name ";

但是如果我像这样改变它:

? like ('%'+name+'%')

然后它就运行了。请问有人知道为什么吗?我问是因为我觉得这里有一些东西需要理解,但我不明白。我特别想知道在使用准备好的语句时是否有其他情况需要添加任意括号?

最佳答案

使用CONCAT(str1,str2,...)连接:

$sql .= " where ? like CONCAT('%', name, '%')";

+ - 是 MySQL 中数字的加法运算符,请参阅:http://dev.mysql.com/doc/refman/5.7/en/arithmetic-functions.html#operator_plus

关于php - 为什么准备好的语句中的计算 'like' 子句需要括号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26196703/

相关文章:

php - 如何读取 CodeIgniter Controller 中的 JSON 文件

php - 使用 php 或 mysql 以分钟为单位查找时差

mysql - 从 MySQL 工作台向 SQL Server 转发工程?

php - 在 boolean 、mysqli_stmt::store_result 和 mysqli_stmt::close() 上调用成员函数 bind_param()

java - 将数据插入 Access 数据库

php - 如何下载文件而不是保存 CSV 文件

php - mysql_connect() 使用 http 协议(protocol)

php - 统计表中分层数据的所有子节点

MySql 相对于其他字段更新和替换表字段

sql - 参数化 SQL 查询语法不正确