【问题标题】:Why won't my prepared statement function properly?为什么我准备好的语句不能正常运行?
【发布时间】:2014-04-06 11:46:32
【问题描述】:

我有一个附属于 php 处理程序的 ajax 调用,其中有一个准备好的语句。

而且它不起作用。没有发现错误。

当我将它从已弃用的 mysql_real_escape 更改为 pdo 准备好的 statememt 时,它就停止了工作。

这是我的代码:

$create_pdo=new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);
$statement=$create_pdo->prepare("INSERT INTO REGISTRY (fname, lname, email, password, age, sex, city, timereg, frcode) VALUES (:fname_received, :lname_received, :email_received,  :password_received, :dob_received, :sex_received, :city_received, :timepassreg, :frcode)");
$statement->bindParam(':fname_received', $fname_received);
$statement->bindParam(':lname_received', $lname_received);
$statement->bindParam(':email_received', $email_received);
$statement->bindParam(':password_received', $password_received);
$statement->bindParam(':dob_received', $dob_received);
$statement->bindParam(':sex_received', $sex_received);
$statement->bindParam(':city_received', $city_received);
$statement->bindParam(':timepassreg', $timepassreg);
$statement->bindParam(':frcode', $frcode);
$statement_executed=$statement->execute();
if ($statement_executed){
$messagetosend="<font size=\"2\" color=\"#347C17\" face=\"Tahoma\"> <strong>Приветствуем нового пользователя проекта 'Фаворит'!</strong></font>,<br><font size=\"2\"        color=\"#1F2320\" face=\"Tahoma\">Для того, чтобы начать пользоваться нашим сайтом, вам нужно будет ввести авторизационный код.<br>Ваш авторизационный код: <font size=\"2\" color=\"#336699\" face=\"Tahoma\"><strong>".$frcode."</strong></font><br>Этот процесс проводится в целях борьбы со спамом и его предотвращения.<br>С уважением,<br>Проект 'Фаворит'.</font>";
$mailheader='MIME-Version: 1.0' . "\r\n" . 'Content-type: text/html; charset=UTF-8' . "\r\n";
$mailheader.="X-Mailer: PHP \r\n";
$mailheader.="From: Фаворит <passwordreminder@favorit.kz>";
mail($email_received,"Авторизация на проекте 'Фаворит'",$messagetosend,$mailheader);
$array_to_json=array("database_input" => "true","mail_sent" => "true");
echo json_encode($array_to_json);
}

我该如何解决这个问题?

【问题讨论】:

  • 参见Errors and error handling:默认情况下,PDO 会静默处理错误(因此,如果$statement_executed 为假,则必须检查$statement-&gt;errorInfo() 以找出原因);这可以根据个人喜好进行更改,以便 PDO 引发警告或异常。
  • 我引入了一个新变量 $statement_error=$statement_executed->errorInfo();结果,我在第 41 行的 /home/letsrate/public_html/favorit/ajax/ajax_user_signup.php 中收到 Parse error: syntax error, unexpected '$statement_error' (T_VARIABLE) 。所以新变量导致了新错误。旧的错误仍然不确定。
  • 应该是$statement-&gt;errorInfo(),而不是$statement_executed-&gt;errorInfo()
  • 我收到了这个错误。致命错误:在第 40 行的 /home/letsrate/public_html/favorit/ajax/ajax_user_signup.php 中的非对象上调用成员函数 errorInfo()
  • 如果$statement 是一个非对象,那么对$create_pdo-&gt;prepare() 的调用一定是失败的(但是你应该收到bindParam()execute() 调用的类似错误?)。您可以检查$create_pdo-&gt;errorInfo() 找出原因。

标签: php mysql pdo


【解决方案1】:

而且它不起作用。没有发现错误。

要显示查询错误,您需要将错误模式属性设置为 PDO::ATTR_ERRMODE。然后您将能够像查看其他 PHP 错误一样查看 PDO 错误

$create_pdo=new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);
$create_pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$statement=$create_pdo->prepare('INSERT INTO REGISTRY (fname, lname, email, password, age, sex, city, timereg, frcode) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)');
$statement_executed = $statement->execute(array($fname_received, $lname_received, $email_received, $password_received, $dob_received, $sex_received, $city_received, $timepassreg, $frcode));

【讨论】:

  • 谢谢,我不知道! :>
猜你喜欢
  • 1970-01-01
  • 2011-07-09
  • 2023-03-19
  • 2010-12-07
  • 1970-01-01
  • 1970-01-01
  • 2013-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多