PHP预处理语句错误:无法通过引用传递参数2

时间:2013-01-05 13:53:33

标签: php prepared-statement

我花了一整天的时间试图找出这个问题而没有运气。我已经看到一些问题,其中常量被直接用作参数。我的所有论据都是变量。我错过了一些非常明显的东西吗?

$one = 1;
$two = 2;
$three = 3;

if (  !($stmt = $mysqli->prepare('INSERT INTO test3 (one, two, three) VALUES (?, ?, ?)'))  ) {
  echo "Prepare failed (".$stmt->errno.") ".$stmt->error."\n";
  $stmt->close();
  exit();
}

if (  !($stmt->bind_param('iii',$one,$two,$three))  ) {
  echo "Failed to bind (".$stmt->errno.") ".$stmt->error;
  $stmt->close();
  exit();
}

if (  !($stmt->execute)  ) {
  echo "Execute failed (". $stmt->errno.") ". $stmt->error."\n";
  $stmt->close();
  exit();
}
编辑:我实际上是在使用bind_param,但是在尝试了不同的事情之后忘了改回来。代码被复制并粘贴。将bind_value更改回bind_param后,我仍然得到相同的错误。

编辑2:我感觉很愚蠢,我用一个新名字保存了我的php文件,所以我可以简化代码,但是我忘了改变POST方法的url来反映这种变化。所以我现在得到的错误是:Undefined property: mysqli_stmt::$execute和mysql日志中的相应输出:

42 Connect     test@localhost on testdb
42 Prepare     [1] INSERT INTO test3 (one, two, three) VALUES (?, ?, ?)
42 Quit       

2 个答案:

答案 0 :(得分:0)

如果您使用的是mysqli,则必须使用bind_param而不是bind_value:

if (  !($stmt->bind_param('iii',$one,$two,$three))  ) {
  echo "Failed to bind (".$stmt->errno.") ".$stmt->error;
  $stmt->close();
  exit();
}

BindValue仅适用于PDO类。

答案 1 :(得分:0)

在下面的代码中,我添加了一行代码。我有同样的问题并再次检查文档,这解决了我的问题。

$one = 1;
$two = 2;
$three = 3;

// This fixed my problem 
$stmt =  $mysqli->stmt_init();

if (  !($stmt = $mysqli->prepare('INSERT INTO test3 (one, two, three) VALUES (?, ?, ?)'))  ) {
  echo "Prepare failed (".$stmt->errno.") ".$stmt->error."\n";
  $stmt->close();
  exit();
}

if (  !($stmt->bind_param('iii',$one,$two,$three))  ) {
  echo "Failed to bind (".$stmt->errno.") ".$stmt->error;
  $stmt->close();
  exit();
}

if (  !($stmt->execute)  ) {
  echo "Execute failed (". $stmt->errno.") ". $stmt->error."\n";
  $stmt->close();
  exit();
}

查看此处的文档http://us.php.net/manual/en/mysqli.stmt-init.php 您还会看到它在mysqli::prepare page

中使用