【问题标题】:Cannot pass parameter 2 by reference - uuid PDO无法通过引用传递参数 2 - uuid PDO
【发布时间】:2012-11-04 16:39:47
【问题描述】:

我正在尝试将UUID() 与我的INSERT 查询一起插入。

$handle->beginTransaction();
// Define query
$query = "INSERT INTO users (users_uuid, type_id) VALUES (:uuid, :type_id)";
// Prepare statement
$stmt = $handle->prepare($query);
// Bind parameters
$stmt->bindParam(':uuid',"SELECT UUID()",PDO::PARAM_STR);
$stmt->bindParam(':type_id',1,PDO::PARAM_INT);
// Execute query
$stmt->execute();
$handle->commit();

此查询返回此错误无法通过引用传递参数 2 ... 在第 51 行。它指向$stmt->bindParam(':uuid',"SELECT UUID()",PDO::PARAM_STR);这一行

我在这里做错了什么?

【问题讨论】:

标签: php mysql pdo


【解决方案1】:

如果你要传递一个值,使用这个:

$type_id = 1;
$stmt->bindValue(':type_id', $type_id, PDO::PARAM_INT);

如果您要绑定参数(传递对变量的引用),请执行以下操作:

$stmt->bindParam(':type_id', $type_id, PDO::PARAM_INT);

// now you can update $type_id, since it is a reference, and execute multiple times:
foreach($id as $i){
    $type_id = $i;
    $stmt->execute();
}

【讨论】:

    【解决方案2】:

    bindParam 的第二个参数是通过引用传递的,应该是一个变量。您直接传递了不允许的值。

    UUID() 直接放在查询中,因为如果它作为参数绑定,它将作为带引号的字符串放在查询中,并且不会被评估为 UUID 值。

    您也可以将1 直接放在查询中。或者将1 分配给一个变量,并将该变量作为第二个参数,同时绑定参数:type_id

    $type_id = 1;
    $stmt->bindParam(':type_id', $type_id, PDO::PARAM_INT);
    

    【讨论】:

    • 等我迷路了,请原谅我的技术术语不足。但是你能用代码说明你的意思吗?
    • 它现在可以正常工作,正如你所建议的,但是我收到了来自var_dump($stmt->execute())NULL 返回
    • 执行后尝试var_dump($stmt->errorInfo());,查看错误信息。
    • 啊,看到了,谢谢它现在可以工作了!添加了问题(如果可以的话)如果生成的 UUID 发生冲突怎么办,有什么办法可以重新生成/尝试再次?我正在查看此 ON DUPLICATE KEY UPDATE 语法,但不确定这是否是我要查找的内容。
    • 在这种情况下你应该得到一个例外,除非你把它们放在try/catch中。如果你在try/catch 中找到了PDOException $e,请在catch 中尝试echo $e->getMessage();die;
    【解决方案3】:

    你的 INSERT INTO users (users_uuid, type_id) VALUES (SELECT UUID(), 1)

    不是一个有效的 mysql 查询

    先尝试获取 uuid(),然后将值插入用户表中

    【讨论】:

      【解决方案4】:

      在这种情况下无需绑定它,只需将其包含在您的查询中即可:

      $query = "INSERT INTO users (users_uuid, type_id) VALUES (UUID(), :type_id)";
      

      ..然后像你​​一样绑定:type_id

      【讨论】:

      • 即使我这样做了,它仍然会返回相同的错误,我什至将 SELECT UUID() 替换为 789EF1A1-0063-44D4-B300-84CDD8D875A5 作为字符串但没有运气。
      • 但是你删除了$stmt->bindParam(':uuid',"SELECT UUID()",PDO::PARAM_STR);吗?
      • 是的,我做到了。只剩下$stmt->bindParam(':type_id',1,PDO::PARAM_INT);了。
      • 如果绑定为参数,它将被转义并最终作为文字字符串。您想要做的是直接在您的查询中使用UUID()。不需要占位符。
      猜你喜欢
      • 2012-10-17
      • 2021-03-31
      • 2013-03-07
      • 1970-01-01
      • 1970-01-01
      • 2014-03-17
      • 2017-10-09
      • 2018-02-21
      相关资源
      最近更新 更多