【问题标题】:Syntax error while executing a sql request with parameters in symfony?使用 symfony 中的参数执行 sql 请求时出现语法错误?
【发布时间】:2020-01-01 04:31:39
【问题描述】:

我猜我有一个简单的问题,我遵循 Symfony 4.3 文档,并尝试完全按照他们所做的来执行 SQL 请求,但是在执行方法中传递参数时出现错误,但我得到了执行相同代码但未向请求传递参数时没有错误。

我试过了,效果很好:

    $conn = $this->getDoctrine()->getManager()->getConnection();

    $sql = '
        SELECT * FROM question_comment WHERE question=2 LIMIT 0, 3';
    $stmt = $conn->prepare($sql);
    $stmt->execute();
    var_dump($stmt->fetchAll());

但这不起作用,我得到一个语法错误:

    $question = $request->query->get('question');
    $row = $request->query->get('row');

    $question = intval($question);
    $beggining = intval($row*3);

    $conn = $this->getDoctrine()->getManager()->getConnection();

    $sql = '
        SELECT * FROM question_comment WHERE question=:question LIMIT :beggining , 3';
    $stmt = $conn->prepare($sql);
    $stmt->execute(['question' => $question, 'beggining' => $beggining]);
    var_dump($stmt->fetchAll());

这是错误:

执行 ' SELECT * FROM question_comment 时发生异常 WHERE question= :question LIMIT :beggining , 3' with params [2, 0]:

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

Here 是我所遵循的,我确实做了那里的事情,但它不起作用。

我尝试了这个解决方案来绑定我的参数,但它也不起作用:

 $sql = '
            SELECT * FROM question_comment WHERE question=:question LIMIT :beggining , 3';
        $stmt = $conn->prepare($sql);
        $stmt->bindParam(':question', $question, \PDO::PARAM_INT); 
        $stmt->bindParam(':beginning', $beginning, \PDO::PARAM_INT); 
        $stmt->execute();

我得到了这个:

执行 ' SELECT * FROM question_comment 时发生异常 WHERE question=:question LIMIT :beggining , 3' with params [2, null]:

SQLSTATE[HY093]:参数号无效:参数未定义

【问题讨论】:

  • 试试这个 $stmt->execute([':question' => $question, ':beggining' => $beggining]);
  • @metal 没用 :(
  • 我相信 symfony 正在使用 PDO,可能想将其更改为 $stmt->bindParam(':question', $question, PDO::PARAM_STR);
  • 似乎这是空的 $row = $request->query->get('row');,这个表 question_comment 的列是什么

标签: php mysql sql parameter-passing symfony4


【解决方案1】:

绑定参数的另一种方法是使用 this。

 $stmt->bindParam(':question', $question, PDO::PARAM_STR); 
 $stmt->bindParam(':beginning', $beginning, PDO::PARAM_INT); 

或确保您绑定了 $beginning 参数,将其强制转换为 int。

$stmt->bindValue(':beginning', (int)trim($beginning), PDO::PARAM_INT);

或者如果你想坚持现有的代码。

$stmt->execute(['question' => $question, 'beggining' => (int)trim($beggining)]);

【讨论】:

  • 因为你的 $request->query->get('row') 为空
  • 不,当然不是,我注释了导致问题的代码,并使用 var_dump 函数检查了 $row 变量,我做对了
  • 我确实将 PARAM_STR 更改为 PARAM_INT 和相同的东西,这很奇怪,我确保 $question 和 $begginig 是整数与 intval() 方法但相同的东西:(
  • 成功了,我在上面拼错了一些东西,但是你的 bindParams 方法真的很有帮助,谢谢。
猜你喜欢
  • 2013-10-07
  • 1970-01-01
  • 2014-12-03
  • 1970-01-01
  • 2020-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多