2015-08-27 2 views
-1

У меня есть две таблицы:НАЧАТЬ, INSERT, COMMIT с дублированием KEY UPDATE

1- отзывы

2 - звезд

Мне нужно обновление 3 значения в таблице и отзывы Вставка новые значения в столовые весы

я это делаю?

ON DUPLICATE KEY не работает, и я не могу найти нигде, как это сделать.

$sql=$dbo->prepare("BEGIN;INSERT INTO beoordelingen(beoordelingid,userid,werkid,inlijn, 
sjabloon,conclusie,save) 

VALUES ('$beoordelingid','$user','$werkid','$inlijn','$sjabloon','$conclusie','0') 

ON DUPLICATE KEY UPDATE 
beoordelingid=VALUES(beoordelingid),userid=VALUES(userid), werkid=VALUES(werkid), 
inlijn=VALUES(inlijn),sjabloon=VALUES(sjabloon),conclusie=VALUES(conclusie), 
save=VALUES(save); 

INSERT INTO sterren (beoordelingid,userid,werkid,titelwerk,actie,sterren) 

VALUES ('$beoordelingid','$user','$id','$titelwerk', 
'$actie','$sterren'); COMMIT"); 

Я адаптировал следующее. Вставка1 все равно не будет работать. Insert2 работы

$dbo->beginTransaction(); 

//NOT WORKING 
$insert1 = $dbo->prepare("INSERT INTO beoordelingen(beoordelingid, userid, werkid, inlijn, sjabloon, conclusie, save) 
VALUES (:beoordelingid, :user, :werkid, :inlijn, :sjabloon, :conclusie, '0') 
ON DUPLICATE KEY UPDATE 
beoordelingid=VALUES(beoordelingid), 
userid=VALUES(userid), 
werkid=VALUES(werkid), 
inlijn=VALUES(inlijn), 
sjabloon=VALUES(sjabloon), 
conclusie=VALUES(conclusie), 
save=VALUES(save);" 
); 
//THIS WORKS 
$insert2 = $dbo->prepare("INSERT INTO sterren (beoordelingid, userid, werkid, titelwerk, actie, sterren) 
VALUES (:beoordelingid, :user, :id, :titelwerk, :actie, :sterren);" 
); 
//NOT WORKING 
$insert1->execute(array(
'beoordelingid' => $beoordelingid, 
'user' => $user, 
'werkid' => $werkid, 
'inlijn' => $inlijn, 
'sjabloon' => $sjabloon, 
'conclusie' => $conclusie, 
'save' => $save 
)); 
//THIS WORKS 
$insert2->execute(array(
'beoordelingid' => $beoordelingid, 
'user' => $user, 
'id' => $werkid, 
'titelwerk' => $titelwerk, 
'actie' => $actie, 
'sterren' => $sterren 
)); 

$dbo->commit(); 

Моя последняя проблема:

$sterren=$_POST['sterren']; 
$user=$_REQUEST['user']; 
$userid=$_POST['userid']; 
$actie=$_POST['actie']; 

$dbo->beginTransaction(); 
//THIS WORKS 
$insert1 = $dbo->prepare("INSERT INTO sterren(sterren,userid,actie) 
VALUES (:sterren, :userid, :actie);" 
); 

//THIS DOESN"T WORK 
$insert2 = $dbo->prepare("INSERT INTO sterren(sterren,userid,actie) 
VALUES (:-sterren, :user, :actie);" 
); 

//THIS WORKS 
$insert1->execute(array(
'sterren' => $sterren, 
'userid' => $userid, 
'actie' => $actie 
)); 

//THIS DOESN"T WORK 
$insert2->execute(array(
'-sterren' => $sterren, 
'user' => $user, 
'actie' => $actie 
)); 

$dbo->commit(); 
+0

довольно уверен, что вы только можете 'подготовить()' * один * SQL запрос в то время. Я не думаю, что вы можете запускать несколько SQL-запросов одновременно (соображения безопасности). Кроме того, если '$ beoordelingid' (и любая другая переменная, которую вы объединяете в эту строку), является'? ', Тогда вы злоупотребляете подготовленными операторами и по-прежнему полностью уязвимы для SQL-инъекции. –

+0

P.S. Это PDO или MySQLi? –

+0

Это PDO. BEGIN, INSERT, COMMIT работает без ключа UPDATE DUPLICATE KEY для вставки в две таблицы, а также без BEGIN, INSERT, COMMIT для обновления таблицы beoordelingen. Но мне нужно сделать оба ... –

ответ

0

Это не то, как использовать подготовленные заявления (->prepare()) или как использовать транзакцию с PDO.

Во-первых, prepare() для «готовится» один SQL запрос с заполнителями, так что вы можете передать параметры в следующей функции (execute()) и избегать инъекции SQL конкатенации строк.

Во-вторых, если вы хотите использовать транзакцию, вы должны использовать функции beginTransaction иPDO.

Попробуйте что-то вроде этого:

$dbo->beginTransaction(); 

$insert1 = $dbo->prepare('INSERT INTO beoordelingen(beoordelingid, userid, werkid, inlijn, sjabloon, conclusie, save) 
    VALUES (:beoordelingid, :user, :werkid, :inlijn, :sjabloon, :conclusie, :save) 
    ON DUPLICATE KEY UPDATE 
     beoordelingid=VALUES(beoordelingid), 
     userid=VALUES(userid), 
     werkid=VALUES(werkid), 
     inlijn=VALUES(inlijn), 
     sjabloon=VALUES(sjabloon), 
     conclusie=VALUES(conclusie), 
     save=VALUES(save);' 
); 

$insert2 = $dbo->prepare('INSERT INTO sterren (beoordelingid, userid, werkid, titelwerk, actie, sterren) 
    VALUES (:beoordelingid, :user, :id, :titelwerk, :actie, :sterren);' 
); 

$insert1->execute(array(
    'beoordelingid' => $beoordelingid, 
    'user' => $user, 
    'werkid' => $werkid, 
    'inlijn' => $inlijn, 
    'sjabloon' => $sjabloon, 
    'conclusie' => $conclusie 
)); 

$insert2->execute(array(
    'beoordelingid' => $beoordelingid, 
    'user' => $user, 
    'id' => $id, 
    'titelwerk' => $titelwerk, 
    'actie' => $actie, 
    'sterren' => $sterren 
)); 

$dbh->commit(); 
+0

Спасибо вам за разъяснение! –

+0

Добро пожаловать :-) –

+0

Rocket Hazmat, если вы все еще вокруг, не могли бы вы снова взглянуть? Я адаптировал запрос 2 (см. Выше), и запрос 2 работает нормально. Но что бы я ни делал, запрос 1 полностью игнорируется базой данных. Спасибо –

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