Это REPLACE
синтаксисСинтаксис дублирование KEY UPDATE с позиционными заполнителями
$sql = "REPLACE INTO 2_1_journal (Number,RecordDay, RecordMonth) VALUES ";
$insertQuery = array();
$insertData = array();
foreach ($_POST['row_id'] as $i => $row_id) {
$insertQuery[] = '(?, ?, ?)';
$insertData[] = $row_id;
$insertData[] = $_POST['date_day'][$i];
$insertData[] = $_POST['date_month'][$i];
}
if (!empty($insertQuery)) {
$sql .= implode(', ', $insertQuery);
$stmt = $db->prepare($sql);
$stmt->execute($insertData);
}
Однако прочитал, что вместо REPLACE
лучше использовать ON DUPLICATE KEY UPDATE
Попытки изменить как этот
$sql = "INSERT INTO 2_1_journal (Number,RecordDay, RecordMonth) VALUES ON DUPLICATE KEY UPDATE (RecordDay, RecordMonth) ";
$insertQuery = array();
$insertData = array();
foreach ($_POST['row_id'] as $i => $row_id) {
$insertQuery[] = '(?, ?, ?, ?, ?)';
$insertData[] = $row_id;
$insertData[] = $_POST['date_day'][$i];
$insertData[] = $_POST['date_month'][$i];
$insertData[] = $_POST['date_day'][$i];
$insertData[] = $_POST['date_month'][$i];
}
if (!empty($insertQuery)) {
$sql .= implode(', ', $insertQuery);
$stmt = $db->prepare($sql);
$stmt->execute($insertData);
}
Но делает не работают (ни вставки, ни обновления)
Что плохого?
Если downvote, пожалуйста, напишите в комментариях, почему (для меня, чтобы избежать писать вещи, которые вызывают downvote)
Update
Измененный код этого
$sql = "INSERT INTO 2_1_journal (Number, RecordDay) VALUES ON DUPLICATE KEY UPDATE RecordDay";
$insertQuery = array();
$insertData = array();
foreach ($_POST['row_id'] as $i => $row_id) {
$insertQuery[] = '(?, ?)';
$insertData[] = $row_id;
$insertData[] = $_POST['date_day'][$i];
}
прибудете SQLSTATE [42000] : Ошибка синтаксиса или нарушение доступа: 1064 У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «ON DUPLICATE KEY UPDATE RecordDay» ('21 ',' '), (' 22 ',' ')' по строке 1
Изменено на это
$sql = "INSERT INTO 2_1_journal (Number, RecordDay) VALUES ON DUPLICATE KEY UPDATE RecordDay=VALUES(Number)";
$insertQuery = array();
$insertData = array();
foreach ($_POST['row_id'] as $i => $row_id) {
$insertQuery[] = '(?, ?)';
$insertData[] = $row_id;
$insertData[] = $_POST['date_day'][$i];
получить SQLSTATE [42000]: ошибка синтаксиса или нарушение прав доступа: 1064 у вас есть ошибка в вашем SQL синтаксиса; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «ON DUPLICATE KEY UPDATE» RecordDay = VALUES (Number) («21», «), (« 22 »,« ») по строке 1
Изменен код этого
$sql = "INSERT INTO 2_1_journal (Number, RecordDay) VALUES ON DUPLICATE KEY UPDATE RecordMonth=?";
$insertQuery = array();
$insertData = array();
foreach ($_POST['row_id'] as $i => $row_id) {
$insertQuery[] = '(?, ?, ?)';
$insertData[] = $row_id;
$insertData[] = $_POST['date_day'][$i];
$insertData[] = $_POST['date_month'][$i];
прибудет SQLSTATE [HY093]: Неверный номер параметра: число связанных переменных не соответствует количеству жетонов
Могут ли я сделать вывод о том, что последний примером является допустимым синтаксисом SQL. Но почему ошибка? Number, RecordDay, RecordMonth =? и $insertQuery[] = '(?, ?, ?)';
3 переменные и 3 жетона? Или я ошибаюсь?
Если $insertQuery[] = '(?, ?)';
то же SQLSTATE [HY093]: Неверный номер параметра: число связанных переменных не соответствует количеству жетонов
Пожалуйста, помогите. Я застрял .... не знаю
Рабочий код !!!
try {
$sql = "INSERT INTO 2_1_journal (Number, RecordDay) VALUES ";
$insertQuery = array();
$insertData = array();
foreach ($_POST['row_id'] as $i => $row_id) {
$insertQuery[] = '(?, ?)';
$insertData[] = $row_id;
$insertData[] = $_POST['date_day'][$i];
}
if (!empty($insertQuery)) {
$sql .= implode(', ', $insertQuery) . 'ON DUPLICATE KEY UPDATE RecordDay = VALUES(RecordDay);';
$stmt = $db->prepare($sql);
$stmt->execute($insertData);
}
}
catch (PDOException $e){
echo "DataBase Error: " .$e->getMessage() .'<br>';
}
catch (Exception $e) {
echo "General Error: ".$e->getMessage() .'<br>';
}
Ваши комментарии, пожалуйста. И посмотрите местоположение ON DUPLICATE KEY UPDATE
!!!
Вы проверили, что ваш окончательный запрос выглядит, прежде чем положить его в 'prepare'? Это просто не соответствует какому-либо действительному запросу SQL. И причина для downvote будет заключаться в том, что вы должны экспериментировать намного больше по своему усмотрению, это просто конкатенация строк в правильном порядке. – deceze
у вас есть сообщение об ошибке? если да, то что это было? –
И ваш запрос очень склонен к инъекциям sql. Поместите некоторое время, чтобы сделать его немного безопасным, по крайней мере, для новичков или компьютерных ярости – ScoRpion