2011-06-21 48 views
0

我对使用PHP PDO进行SELECT查询的INSERT有奇怪的行为。测试查询直接在MySQL它工作得很好,我让我的插入行:使用PDO从SELECT进行MySQL INSERT

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; 

我错过了什么?我几乎可以确定它只是无法使其插入单行。

谢谢。

fabien。

+0

等等......我发现了我甚至在这里粘贴的愚蠢错误:bindParam。 $ username分配给:username和:pwd。对于这个问题抱歉,并且感谢Pekka的回复。 – feub

+0

啊,够公平 - 我误解了查询。 –

回答

1

不是说这是可能的问题,而是你在密码字段中输入了用户名。在你的查询中,你在那里插入aeskey。这是我能发现的唯一区别。

+0

是的是,这是这个,不明白为什么我不能在发布之前发现这个问题..抱歉的家伙,谢谢你:> – feub

0

查看PDO::bindParam的PHP文档。一个用户有建议:

...你必须使用每个参数一次 只有一次......

因此,您所使用的用户名和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; 
+0

我们不应该问他为什么选择用户提供所有参数? :) –

+0

杰夫,查询的原因不是我的问题,但如果你想要一个答案,我只需要在临时表中加密用户的ID和密码,以将它们传递给Java应用程序(而不是由我开发)。关于这一点,只要解决方案很简单并且不需要任何其他程序(Apache/PHP/MySQL除外),我就可以接受任何有关如何在PHP和Java应用程序之间传递参数的建议。 – feub