PDO准备子查询

时间:2017-02-09 08:14:29

标签: php sql pdo

我是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();

2 个答案:

答案 0 :(得分:1)

您需要将$ playerOne,$ playerTwo绑定到准备好的语句作为参数。 http://php.net/manual/en/mysqli.prepare.php

MyVec(const std::vector<double>& y) { x = y; }

答案 1 :(得分:0)

准备语句的整体机制在支持它的所有数据库扩展中都是相同的:

  • 用占位符替换数字或字符串文字(我的意思是,文字,而不是随机的代码片段),基于位置?或命名为:username(不要...混合,选择一个)
  • 通过调用接收SQL作为参数
  • 的相应函数来准备查询
  • 通过调用接收值为paremeter
  • 的相应函数来执行准备好的查询

因此,如果您在mysqli中正确执行此操作,则切换到PDO不需要更改逻辑。但是,您的代码示例建议您根本没有使用预先准备好的语句:没有占位符,没有单独渠道中的数据......我可以看到variable interpolation in double quoted strings,但是&#39 ; PHP功能,而不是SQL功能。因此,分离代码和数据并防止SQL注入是完全没用的。

我怀疑根本误解并不完全确定PHP和SQL如何交互。答案是它们不是:它们是完全不同的计算机语言,它们由完全不同的程序执行。唯一的关系是你使用前者生成后者。无论你做什么,最后你只需要向数据库服务器提交一个字符串(即纯文本)。如何生成该文本是无关紧要的,因为字符串没有内存。