2013-02-17 118 views
1

我正在使用PDO綁定參數直接更新MySQL數據庫。更新成功並在 - > execute();之後放置打印語句。工作正常,但當PHP嘗試退出時,我得到一個malloc錯誤,並且php進程被其父進程中止。PDO準備的語句導致SIGABRT

的代碼如下:

<?php 
$edit_type = 'Edit'; 
$employeeID = 1; 
$surname = 'Green'; 
$givenname = 'Frodo'; 
$degree = 'PhD'; 
$title = 'Some_Title'; 
$division = 'Some_Division'; 
$office_phone = 'number'; 
$email = '[email protected]'; 
$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(Abort)終止

魚是我的殼。我的PHP版本是:

PHP 5.3.15用了Suhosin貼片(CLI)(建:2012年8月24日十七時45分44秒) 版權所有(C)1997-2012的PHP集團 Zend引擎V2。 3.0,版權所有(C)1998-2012 Zend技術

我的MySQL版本是:

版14.14 DISTRIB 5.5.27,使用readline的5.1

01 osx10.6(I386)

任何幫助將不勝感激。

編輯: 正如進一步的數據點,看起來精確的觸發器是我使用「bindValue」。將它們取出並簡單地將適當的變量插入「準備」語句中可防止崩潰。所以我想這是一個可能的解決方案,儘管存在嚴重的安全問題。

+0

得到那種錯誤意味着你的php安裝有一個主要問題。 – 2013-02-17 23:00:19

+0

我正在運行OS X 10.8.2,使用內置的PHP安裝。這是蘋果公司發佈的PHP設置的已知問題嗎? – GreenQuestor 2013-02-18 12:52:02

回答

0

是否有可能您的PHP安裝已過時或某些臨時(非版本)構建?這似乎與v known bug類似。看看你是否可以更新或卸載/重新安裝PHP。

+0

不幸的是,這是一個沼澤標準的Mac OS X 10.8.2 PHP安裝。我會考慮安裝更新版本。 5.3.15已知是這樣的越野車嗎? – GreenQuestor 2013-02-18 23:40:51

+0

當然有更新/升級可用。你可以試試看看它是否更好。 – ethrbunny 2013-02-18 23:54:43