SQLSTATE [42000]使用bindParam时

时间:2017-07-22 12:22:36

标签: php mysql

我正在尝试使用此视频https://www.youtube.com/watch?v=DHUxnUX7Y2Y在PHP中实现后端RESTful API。

$app->get('/api/customers/{id}', function (Request $request, Response $response) {
    $id = $request->getAttribute('id');

    $sql = "SELECT * FROM customers WHERE id = :id";

    try {
        // Get DB Object
        $db = new db();
        // Connect
        $db = $db->connect();

        $stmt = $db->query($sql);
        $stmt->bindParam(':id', $id);
        $customers = $stmt->fetch(PDO::FETCH_OBJ);

        $db = null;

        echo json_encode($customers);
    } catch (PDOException $e) {
        echo '{"error": {"text": '.$e->getMessage().'}';
    }
});

当我想使用bindParam时,我总是收到错误:

  

SQLSTATE [42000]:语法错误或访问冲突:1064 SQL语法中有错误;检查与MySQL服务器版本对应的手册,以便在第1行的“:id”附近使用正确的语法

服务器使用MySql“服务器版本:5.6.36-log - 源分发”

1 个答案:

答案 0 :(得分:2)

如果这是使用PDO,请使用预准备语句而不是查询。这意味着要调用prepareexecute而不是query

我在下面更新了您的代码作为示例:

    $stmt = $db->prepare($sql);
    $stmt->bindParam(':id', $id);
    $stmt=>execute();
    $customers = $stmt->fetch(PDO::FETCH_OBJ);

在这种情况下,您可能还需要考虑使用bindValue代替bindParam来简化代码。 bindParam通过引用传递语句来执行语句时评估$id的值,如果id不会改变,这似乎是不必要的,因此bindValue可能就足够了。

参考手册: