PHP, PDO, оператор SQLite INNER JOIN и переменная - PullRequest
0 голосов
/ 26 сентября 2018

Мне нужно сделать вызов PHP PDO для моей базы данных с помощью предложений INNER JOIN и WHERE.

В графическом интерфейсе Navicat этот оператор работает нормально, и я могу видеть результаты.Проблема всплыла в среде php по поводу конкатенации строк.

Я хотел бы отформатировать этот запрос так, чтобы он мог быть переварен php:

SELECT * FROM tsourcetb as T INNER JOIN users as U ON U.username = T.username WHERE U.username = $username AND T.username = $username;

, что я пытался сделать

$sth = $db->prepare("SELECT * FROM tsourcetb as T INNER JOIN users as U ON U.username = T.username WHERE U.username = $username AND T.username = $username");

возврат - ошибкачто указывает на отсутствие таблицы с именем переменной.По сути, она принимает переменную в качестве имени таблицы, возвращаемое значение - ошибка, указывающая, что нет таблицы с именем переменной.По сути, она принимает переменную в качестве имени таблицы, а не имя таблицы, как должно (SELECT * FROM $ username), выпрыгивая из первой части оператора).

Намерение состоит в том, чтобы иметь все записи таблицыA, где поле имени пользователя = = поле имени пользователя таблицы B со значением, переданным из переменной.Спасибо за любое предложение для достижения моей цели.

ОБНОВЛЕНИЕ

php - это магия, которую нужно попробовать и переобучить.В конце вы помогаете мне достичь цели:

$username = ($_POST['username']);
$password = ($_POST['password']);

$statement = $db->prepare('SELECT p.* FROM `tsourcetb` as p LEFT JOIN    `users`as s ON p.username = s.username WHERE s.username = :username;');
$statement->bindParam(':username', $username, PDO::PARAM_STR);
$statement->execute();

/ * посмотрите здесь -> $ Statement-> fetchall (PDO :: FETCH_ASSOC) * /

$array_select = $statement->fetchall(PDO::FETCH_ASSOC);
echo json_encode($array_select, JSON_PRETTY_PRINT);

Ответы [ 3 ]

0 голосов
/ 26 сентября 2018

При выполнении динамического запроса с PDO необходимо связать параметры.Измените это в своем запросе.

$username -> :username

И перед тем, как сделать вызов

$yourQueryObj->bindValue(':username', $username, PDO::PARAM_STR);

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

Вы можете прочитать об этом здесь http://php.net/manual/en/pdostatement.bindvalue.php

Вы также сможете выполнить с массивом параметров после такой подготовки:

$sth = execute(array(':username'=> $username));
0 голосов
/ 26 сентября 2018
<?php


$sth = $db->prepare("SELECT * FROM `tsourcetb` as T INNER JOIN users as U ON U.username = T.username WHERE U.username = ?  AND T.username = ? ");
$sth->execute([$username,$username]);
$results = $sth->fetchall();


?>

обернуть имя таблицы обратными метками, а также использовать заполнители

0 голосов
/ 26 сентября 2018

Попробуйте:

$stmt = $db->prepare("SELECT * FROM tsourcetb as T INNER JOIN users as U ON U.username = T.username WHERE U.username = :username AND T.username = :username");
$stmt->bindValue(':username', $username, PDO::PARAM_STR);
$stmt->execute();

Вам необходимо связать значение с подготовленным оператором:

Источник: Документы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...