如何在 Doctrine 准备的 SQL 语句中使用 + 或 - 运算符作为参数?

尝试使用以下代码:


$operator = '+';

$conn = $entityManager->getConnection();

$stmt = $conn->prepare("

    UPDATE articles a SET a.position = a.position :operator 1

")->execute([

    'operator' => $operator

]);

在 SQL 语句中UPDATE articles a SET a.position = a.position :operator 1,:operator参数应该替换为'+', 来自先前定义的$operator变量,但实际上它运行失败并返回此错误:


执行 'UPDATE 文章 a SET a.position = a.position :operator + 1 with params ["+"] 时发生异常:


SQLSTATE[42000]:语法错误或访问冲突:1064 你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在 ''+' 1 附近使用的正确语法


湖上湖
浏览 145回答 1
1回答

小怪兽爱吃肉

您不需要绑定您可以完全控制的文字字符。而绑定是针对实参的。保留字、运算符、数据库标识符……所有这些都没有“绑定”到 SQL 语句中。由于这些永远不会来自用户输入,因此这样做毫无意义。这只能从现有配置、白名单字符串等安全生成。只需正常插入连接字符串中的字符:$operator = '+';$conn = $entityManager->getConnection();$stmt = $conn    ->prepare("UPDATE articles a SET a.position = a.position $operator 1")    ->execute();由于您没有参数,因此您可以完全不用准备语句:$stmt = $conn    ->executeQuery("UPDATE articles a SET a.position = a.position $operator 1");
打开App,查看更多内容
随时随地看视频慕课网APP