1

PDO バインド パラメータを使用して、MySQL データベースを簡単に更新しています。更新は成功し、->execute(); の後に print ステートメントが配置されます。正常に動作しますが、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";
    }
}
?>

これから、データベースの更新が成功し、「Finished」が出力され、次のエラーメッセージが表示されます。

php(12652) malloc: * オブジェクト 0x116f07438 のエラー: 解放されるポインターが割り当てられていません *デバッグするために malloc_error_break にブレークポイントを設定します

fish: ジョブ 1、'php database_write_probe.php' がシグナル SIGABRT (中止) で終了しました

魚は私の殻です。私のPHPバージョンは次のとおりです。

PHP 5.3.15 with Suhosin-Patch (cli) (ビルド: 2012 年 8 月 24 日 17:45:44) Copyright (c) 1997-2012 The PHP Group Zend Engine v2.3.0、Copyright (c) 1998-2012 Zend Technologies

私のMySQLのバージョンは次のとおりです。

Ver 14.14 Distrib 5.5.27、osx10.6 (i386) 用 readline 5.1 を使用

どんな助けでも大歓迎です。

EDIT:さらなるデータポイントとして、正確なトリガーは私の「bindValue」の使用であるようです。それらを取り出して、適切な変数を「prepare」ステートメントに挿入するだけで、クラッシュを防ぐことができます。深刻なセキュリティ上の問題はありますが、それが 1 つの可能な解決策だと思います。

4

1 に答える 1

0

PHP のインストールが古いか、中間 (非リリース) ビルドである可能性はありますか? これは、既知のバグに似ているようです。PHP を更新またはアンインストール / 再インストールできるかどうかを確認します。

于 2013-02-18T15:41:47.443 に答える