MySQL INSERT из SELECT с PDO - PullRequest
       3

MySQL INSERT из SELECT с PDO

0 голосов
/ 21 июня 2011

У меня странное поведение при использовании PHP PDO для вставки из запроса SELECT. Тестируя запрос непосредственно в MySQL, он работает хорошо, я вставляю строку:

INSERT INTO sessionid (enc_id, enc_pass, enc_date) 
SELECT AES_ENCRYPT(username, 'aeskey'), AES_ENCRYPT(pwd, 'aeskey'), 
DATE_ADD(NOW(), INTERVAL 15 SECOND) FROM users WHERE username = 'a_user_name';

Но используя PDO, я вставляю по одной строке на пользователя сразу (279 строк) .... Вот PHP:

$sql_enc = '
    INSERT INTO sessionid (enc_id, enc_pass, enc_date) 
        (SELECT AES_ENCRYPT(username, :aeskey), AES_ENCRYPT(pwd, :aeskey), DATE_ADD(NOW(), INTERVAL 15 SECOND) FROM users WHERE username = :username)
';
$res_enc = $pdo->prepare($sql_enc);
$res_enc->bindParam(':aeskey', $aeskey);
$res_enc->bindParam(':username', $username);
$res_enc->bindParam(':pwd', $username);
$res_enc->execute();
$res_enc = null;

Чего мне не хватает? Я почти уверен, что это ничто, но не могу заставить его вставить этот единственный ряд.

Спасибо.

Фабьен.

Ответы [ 2 ]

1 голос
/ 21 июня 2011

Не то чтобы это вероятная проблема, но вы вводите имя пользователя в поле пароля в своем коде.В своем запросе вы вставляете туда эски.Это единственное отличие, которое я могу заметить.

0 голосов
/ 21 июня 2011

Посмотрите на документацию PHP для PDO :: bindParam . Один пользователь предложил:

... вы должны использовать каждый параметр один раз и только один раз ...

Итак, вы использовали имя пользователя и aeskey дважды. Сделай так:

$sql_enc = '
    INSERT INTO sessionid (enc_id, enc_pass, enc_date) 
        (SELECT AES_ENCRYPT(:username1, :aeskey1), AES_ENCRYPT(:pwd, :aeskey2), DATE_ADD(NOW(), INTERVAL 15 SECOND) FROM users WHERE username = :username2)
';
$res_enc = $pdo->prepare($sql_enc);
$res_enc->bindParam(':aeskey1', $aeskey);
$res_enc->bindParam(':aeskey2', $aeskey);
$res_enc->bindParam(':username1', $username);
$res_enc->bindParam(':username2', $username);
$res_enc->bindParam(':pwd', $username);
$res_enc->execute();
$res_enc = null;
...