我正在使用 PDO 绑定参数对 MySQL 数据库进行直接更新。更新成功并且在 ->execute(); 之后放置了一个打印语句。工作正常,但是当 php 尝试退出时,我得到一个 malloc 错误,并且 php 进程被其父进程中止。
代码如下:
<?php
$edit_type = 'Edit';
$employeeID = 1;
$surname = 'Green';
$givenname = 'Frodo';
$degree = 'PhD';
$title = 'Some_Title';
$division = 'Some_Division';
$office_phone = 'number';
$email = 'adress@someplace.foo';
$room = 'abc-123';
$PI_ID = 1;
$confirmDeactivate = 'Do Not Deactivate';
// Establish a MySQL Connection
try {
$cvbrdbh_update = new PDO("mysql:host={$_SERVER['MYSQL_SERVER']};dbname={$_SERVER['MYSQL_DB']}",$_SERVER['MYSQL_USER'],$_SERVER['MYSQL_PASSWORD'], array(PDO::ATTR_PERSISTENT => true));
$cvbrdbh_update->exec("SET CHARACTER SET utf8");
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "\n" ;
die();
}
$cvbrdbh_update->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$cvbrdbh_update->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
if ($employeeID && $edit_type == "Edit") {
if (empty($surname)) {
print "Warning! The Surname field was empty. Please restart the editing process and be sure to fill in a surname.";
} else {
$person_update_stmt = $cvbrdbh_update->prepare("UPDATE employees, med_division, titles, pi_emp SET Surname=:surname, GivenName=:givenname, Degree=:degree, Office_Phone=:office_phone, Email=:email, Room=:room, Division=:division, Title=:title, med_division.PI_ID=:pi_id1, pi_emp.PI_ID=:pi_id2 WHERE employees.EmployeeID = '$employeeID' AND med_division.EmployeeID = '$employeeID' AND titles.EmployeeID = '$employeeID' AND pi_emp.EmployeeID = '$employeeID'");
$person_update_stmt->bindValue(':surname',$surname,PDO::PARAM_STR);
$person_update_stmt->bindValue(':givenname',$givenname,PDO::PARAM_STR);
$person_update_stmt->bindValue(':degree',$degree,PDO::PARAM_STR);
$person_update_stmt->bindValue(':office_phone',$office_phone,PDO::PARAM_STR);
$person_update_stmt->bindValue(':email',$email,PDO::PARAM_STR);
$person_update_stmt->bindValue(':room',$room,PDO::PARAM_STR);
$person_update_stmt->bindValue(':division',$division,PDO::PARAM_STR);
$person_update_stmt->bindValue(':title',$title,PDO::PARAM_STR);
$person_update_stmt->bindValue(':pi_id1',$PI_ID,PDO::PARAM_STR);
$person_update_stmt->bindValue(':pi_id2',$PI_ID,PDO::PARAM_STR);
$person_update_stmt->execute();
print "Finished" . "\n";
}
}
?>
由此,我得到一个成功的数据库更新,它打印“完成”,然后是以下错误消息:
php(12652) malloc: * 对象 0x116f07438 的错误:未分配被释放的指针 *在 malloc_error_break 中设置断点以进行调试
鱼:作业 1,“php database_write_probe.php”由信号 SIGABRT(中止)终止
鱼是我的壳。我的 PHP 版本是:
带有 Suhosin-Patch (cli) 的 PHP 5.3.15(构建时间:2012 年 8 月 24 日 17:45:44) 版权所有 (c) 1997-2012 The PHP Group Zend Engine v2.3.0,版权所有 (c) 1998-2012 Zend Technologies
我的 MySQL 版本是:
Ver 14.14 Distrib 5.5.27,用于 osx10.6 (i386) 使用 readline 5.1
任何帮助将不胜感激。
编辑:正如进一步的数据点,看来精确的触发是我使用“bindValue”。将它们取出并简单地将适当的变量插入“准备”语句可以防止崩溃。所以我想这是一种可能的解决方案,尽管它存在严重的安全问题。