准备好的陈述问题

时间:2014-09-10 18:38:44

标签: php mysql

我正在开发一个网站界面,以便我的同事可以轻松地将元组添加到数据库中。我不明白为什么这段代码不起作用,我希望有人可以帮助我。感谢。

$query = "INSERT INTO animal (MouseID,birthDate,harvestDate,injectionDate1,
    injectionDate2,injectionDate3,Adjuvant,Target,Gender,Age,animalType,
    Titer,antibodyType) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)";

    $statement = $databaseConnection->prepare($query);
    $statement->bind_param('sssssssssisss', $_POST['mouseid'], $_POST['birthdate'], $_POST['harvestdate'], $_POST['injectiondate1'], $_POST['injectiondate2'],
     $_POST['injectiondate3'], $_POST['adjuvant'], $_POST['target'], $_POST['gender'], $_POST['age'], $_POST['animaltype'], $_POST['titer'], $_POST['antibodytype']);
    $statement->execute();
    $statement->close();

3 个答案:

答案 0 :(得分:0)

bind_param需要引用:

$query = "INSERT INTO animal (MouseID,birthDate,harvestDate,injectionDate1,
    injectionDate2,injectionDate3,Adjuvant,Target,Gender,Age,animalType,
    Titer,antibodyType) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)";

$statement = $databaseConnection->prepare($query);
$statement->bind_param('sssssssssisss', &$_POST['mouseid'], &$_POST['birthdate'],
  &$_POST['harvestdate'], &$_POST['injectiondate1'], &$_POST['injectiondate2'],
  &$_POST['injectiondate3'], &$_POST['adjuvant'], &$_POST['target'], &$_POST['gender'],
  &$_POST['age'], &$_POST['animaltype'], &$_POST['titer'], &$_POST['antibodytype']);
$statement->execute();
$statement->close();

答案 1 :(得分:0)

您没有检查prepareexecute功能是否成功。

如果您不打算检查这些函数的返回,您可以让PDO自动执行检查,并在发生数据库错误时通过设置连接上的属性引发异常:

$databaseConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

如果您没有检查函数的返回,那么您的代码实际上是“吞噬”发生的任何数据库错误。

设置这些连接属性不是处理数据库错误的唯一方法,并不总是最合适的方法。

另一种方法是显式检查代码中函数的返回值,例如:

$sql = "INSERT INTO ... ";

$stmt = $dbh->prepare($sql);
if(!$stmt) {
   print_r($dbh->errorInfo());
}

if(!$stmt->execute()) {
   print_r($dbh->errorInfo());
}

使用其中一种方法,可能会发现数据库错误正在发生。实际的错误代码和消息将有助于确定实际问题是什么。否则,我们只是在猜测。

答案 2 :(得分:0)

当您使用PDO时,此处的正确过程是将所有值作为数组传递给execute()方法:

$statement->execute(array('sssssssssisss', $_POST['mouseid'], [...]));

或者对每个值使用bindParam()/ bindValue(),但是你必须使用命名参数(:parametername)。

对于未来:检查所有方法的返回值,启用错误报告/日志记录,使PDO在错误($databaseConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);)上抛出异常并最终在您的问题中发布任何显示的错误消息,这有助于回答它。