我是PDO的新手,我正在尝试将我的MySQLi程序结构的PHP代码更改为面向对象的PDO结构。我正在学习准备,执行,bindParam / bindValue等等,以取得一定程度的成功。
我的问题是,当用户提交的值在该查询的子查询中时,如何准备查询?
我有一个变量用作php中的子查询(其中$ playerOne,$ playerTwo是用户提交的值)。
$sqlPlayerOne = "(SELECT * FROM players WHERE Player_name = $playerOne)";
$sqlPlayerTwo = "(SELECT * FROM players WHERE Player_name = $playerTwo)";
这是为了获得这些玩家的所有记录。作为一个例子,我可以比较他们互相比对的游戏,例如
$sqlWith = "SELECT * FROM $sqlPlayerOne s1
WHERE EXISTS (SELECT * FROM $sqlPlayerTwo s2 WHERE s1.Team_name = s2.Opposing_team)
注意:SELECT *
仅用于使其更具可读性。
执行$pdoWith = $db->prepare($sqlWith)
是否足够,或者我应该首先准备$sqlPlayerOne
,因为这具有用户提交的值?
我意识到我可以在每个需要它的主要查询中复制/粘贴子查询,但是如果我不必,那我就不愿意。
编辑:抱歉缺乏清晰度。在我更改之前,这是我的代码的一部分,因为我不确定如何更改它。看来我只需要像@ J-C FOREST所指出的那样: $dsn = "mysql:host=localhost;dbname=database";
$username = "user";
$password = "pass";
$db = new PDO($dsn, $username, $password);
$stmt = $db->prepare("SELECT * FROM (SELECT * FROM players WHERE Player_name = :playerone)
s1 WHERE EXISTS (SELECT * FROM (SELECT * FROM players WHERE Player_name = :playertwo) s2
WHERE s1.Team_name = s2.Opposing_team)");
$stmt->bindValue(':playerone', $playerOne);
$stmt->bindValue(':playertwo, $playerTwo);
$stmt->execute();
答案 0 :(得分:1)
您需要将$ playerOne,$ playerTwo绑定到准备好的语句作为参数。 http://php.net/manual/en/mysqli.prepare.php
MyVec(const std::vector<double>& y) { x = y; }
答案 1 :(得分:0)
准备语句的整体机制在支持它的所有数据库扩展中都是相同的:
?
或命名为:username
(不要...混合,选择一个)因此,如果您在mysqli中正确执行此操作,则切换到PDO不需要更改逻辑。但是,您的代码示例建议您根本没有使用预先准备好的语句:没有占位符,没有单独渠道中的数据......我可以看到variable interpolation in double quoted strings,但是&#39 ; PHP功能,而不是SQL功能。因此,分离代码和数据并防止SQL注入是完全没用的。
我怀疑根本误解并不完全确定PHP和SQL如何交互。答案是它们不是:它们是完全不同的计算机语言,它们由完全不同的程序执行。唯一的关系是你使用前者生成后者。无论你做什么,最后你只需要向数据库服务器提交一个字符串(即纯文本)。如何生成该文本是无关紧要的,因为字符串没有内存。