Я довольно новичок в PDO, и я пытаюсь изменить свой структурно-структурированный PHP-код MySQLi на объектно-ориентированную структуру PDO. Я просто изучаю подготовку, выполнение, bindParam/bindValue и т. П. До степени успеха.PDO-подготовка с подзапросами
Мой вопрос: как подготовить запрос, когда представленное пользователем значение находится в подзапросе этого запроса?
У меня есть переменная, используемая как подзапрос в 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
, так как у этого есть представленная пользователем стоимость?
Я понимаю, что могу просто скопировать/вставить подзапрос внутри каждого основного запроса, который ему нужен, но если мне этого не нужно, я бы этого не сделал.
EDIT: Извините за отсутствие ясности. Это был раздел моего кода, прежде чем я его изменил, так как я не был уверен, как мне его изменить. Кажется, я просто должен сделать это подобно тому, как @JC 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();
Что вы пытаетесь сделать, я ничего не понимаю. То, что вы делаете, недопустимо. Вам нужно быть в курсе того, что вы хотите сделать с этими тремя запросами, и вам просто нужно подготовить 1 запрос, даже если у него есть подзапросы – 131
Вы понимаете, как действительно работает документ, подготовленный PDO? У вас есть идея, что такое ** placeholder **? Ваша переменная $ sqlPlayerOne не показывает никаких признаков использования с «bindParam/bindValue и т. П.» –
Это запуталось. Вы отредактировали вопрос, чтобы задать что-то совсем другое, затем приняли ответ, который не объясняет, что не так с исходным кодом, и не объясняет синтаксис PDO. Надеюсь, вы поняли основы подготовленных заявлений, а не просто слепо вставляли код в свой проект ;-) –