2013-05-14 3 views
3

Это 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 !!!

+0

Вы проверили, что ваш окончательный запрос выглядит, прежде чем положить его в 'prepare'? Это просто не соответствует какому-либо действительному запросу SQL. И причина для downvote будет заключаться в том, что вы должны экспериментировать намного больше по своему усмотрению, это просто конкатенация строк в правильном порядке. – deceze

+0

у вас есть сообщение об ошибке? если да, то что это было? –

+0

И ваш запрос очень склонен к инъекциям sql. Поместите некоторое время, чтобы сделать его немного безопасным, по крайней мере, для новичков или компьютерных ярости – ScoRpion

ответ

0

Всякий раз, когда вы используете код для создания SQL заявления, добавьте строку:

echo $sql; 

непосредственно перед выполнением инструкции. Таким образом вы можете видеть, что вы на самом деле выполняете.

Затем вы можете вырезать & вставить инструкцию SQL непосредственно в базу данных и посмотреть, что произойдет.

Также - для предотвращения инъекций SQL, добавьте

$row_id = mysql_real_escape_string($POST['row_id']); 
$date_day = mysql_real_escape_string($_POST['date_day']); 
$date_month = mysql_real_escape_string($_POST['date_month']); 

в начале вашего кода, а затем использовать $ ROW_ID вместо $ POST [ 'ROW_ID'] в остальной части кода. И $ date_day вместо $ _POST ['date_day'] и $ date_month вместо $ _POST ['date_month'] и т. Д. - сделайте это для всех ваших POST и GET переменных.

Проверьте это: http://xkcd.com/327/

Смежные вопросы