好的,所以我现在已经折腾了2个小时,无法弄清楚所谓的SQL语法错误在哪里。我最终将准备好的语句重写为标准查询 - 它工作正常,语法完全相同。
准备好的声明代码:(不工作)
if ($account_info = $mysqli->prepare("SELECT users.specid, users.username ?
FROM users ? WHERE users.id = ?")) {
//A SWITCH to determine bind_param and bind_result
} else {
//Error output
}
以上结果导致以下 MYSQL 错误:
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 '? FROM users ? WHERE users.id = ?' at line 1
现在,如果我从字面上改变 '?'到 $variables 并将准备好的语句变成一个普通的查询,如:
if ($account_info = $mysqli->query("SELECT users.specid, users.username $param1
FROM users $param2 WHERE users.id = $param3")) {
//Fetch array and set variables to results
} else {
//Error output
}
以上代码按预期工作,没有错误。
对于那些好奇我正在测试的特定 switch case 中的 $variables 是什么的人:
$param1 = ', tenants.paper';
$param2 = ', tenants';
$param3 = $_SESSION['user_id'].' AND tenants.id = users.specid';
那么,当它们具有相同的语法时,为什么一个有效而另一个无效呢???它甚至没有到达 bind_param 部分!?我更愿意使用准备好的语句方法。
最佳答案
您不能将对象 nane(表名或列名)作为参数传递。
所以 users.username ?
和 users ?
您尝试使用的是错误的..
传递参数不是字符串替换..
参数绑定(bind)不允许这种行为
你应该避免这种情况......但是如果你真的需要那么尝试使用字符串连接
关于php - 为什么 mysqli QUERY 有效,但相同的 PREPARED 语句版本返回 SQL 语法错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45072539/