После публикации этого вопроса Обновление MySQL или запрос вставки или смерти Я перешел на использование PDO, но у меня возникли некоторые проблемы с использованием фразы обновления дублирующегося ключа.
Вот пример моего массива данных
array(114) {
["fname"]=>
string(6) "Bryana"
["lname"]=>
string(6) "Greene"
["m080"]=>
string(1) "c"
["t080"]=>
string(1) "-"
["w080"]=>
string(1) "-"
["r080"]=>
["notes"]=>
string(4) "yoyo"}
В действительности есть 113 полей, но я не хотел тратить место, показывая их здесь. В настоящее время я пытаюсь вставить / обновить в своей базе данных с помощью следующего кода
try {
$dbh = new PDO('login info here');
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$stmt = $dbh->prepare(
'INSERT INTO fhours ('.implode(",", array_keys($faculty)).')'.
' VALUES (:'.implode(",:", array_keys($faculty)).')'.
' ON DUPLICATE KEY UPDATE :fieldlist');
$stmt->bindParam(':field_list', $field_list);
foreach($faculty as $key=>$val){
$stmt->bindParam(':'.$key, $val);
$fields[] = sprintf("%s = :%s", $key, $key);
}
$field_list = join(',', $fields);
//echo $stmt->debugDumpParams();
$stmt->execute();
}
catch(PDOException $e){
echo $e->getMessage();
exit();
}
Я получаю неверный номер параметра: параметр не был определен, сообщение об ошибке. Я почти уверен, что мои проблемы лежат в ON DUPLICATE KEY UPDATE :fieldlist');
, но я сделал так много разных попыток, и ни одна из них не сработала. Должен ли я вообще использовать ON DUPLICATE KEY UPDATE
?
Кроме того, я новичок в синтаксисе: and ::, означает ли :name
, что это именованная переменная типа $name
и PDOStatement::bindValue
вроде PDOStatement->bindValue
?
Редактировать
В ответ на первые два комментария ниже я таким образом обновил код (но все равно безрезультатно, debugDumpParams говорит, что у меня нет параметров). Кроме того, зачем создавать $array_of_parameters
, когда для начала он становится точно таким же массивом, как $faculty
?
//grab form data
$faculty = $_POST;
$fname = $_POST['fname'];
$lname = $_POST['lname'];
//delete the submit button from array
unset($faculty['submit']);
$array_of_parameters = array();
foreach($faculty as $key=>$val){
$array_of_parameters[$key] = $val;
$fields[] = sprintf("%s=?", $key);
}
$field_list = join(',', $fields);
try {
$dbh = new PDO('mysql:host=localhost;dbname=kiosk', 'kiosk', 'K10$k');
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$update = 'UPDATE fhours SET '.$field_list. 'WHERE fname="'.$fname.'" AND '.
'lname="'.$lname.'"';
$stmt = $dbh->prepare($update);
//echo $stmt->debugDumpParams();
$stmt->execute(array($array_of_parameters));
if($stmt->rowCount() == 0){
$insert = 'INSERT INTO fhours ('.implode(",", array_keys($faculty)).')'.
' VALUES (:'.implode(",:", array_keys($faculty)).')';
$stmt = $dbh->prepare($insert);
$stmt->execute(array($array_of_parameters));
}
}
catch(PDOException $e){
echo $e->getMessage();
exit();
}
$dbh=null;