PHP PDO параметризованный запрос для MySQL - PullRequest
1 голос
/ 16 июня 2011

All

Я пытаюсь написать функцию, которая проверила бы в моей таблице users, существует ли уже имя пользователя или адрес электронной почты пользователя. Это будет использоваться в качестве проверки при регистрации пользователя.

Я хочу использовать ту же функцию, чтобы проверить, существует ли электронная почта или имя. Я бы использовал функцию, отправив ей 2 строковые переменные: $ tableColName, представляющий столбец в таблице db (так что либо «userName» или «userEmail», и $ userIdentifier, представляющий либо имя пользователя, либо электронную почту пользователя. хочу запросить.

Я написал следующее (изменено, чтобы быть свободно стоящим):

<?php
    $dbHost="localhost";
    $dbName="project";
    $dbUser="admin";
    $dbPassword="abcd";
    $dbh=new PDO("mysql:host=$dbHost;dbname=$dbName", $dbUser, $dbPassword);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $userIdentifier="apple";  // Or "apple@gmail.com", which is an email
    $tableColName="userName"; // Or "userEmail"
    $sth=$dbh->prepare("SELECT * FROM users WHERE :tableColName = :userIdentifier");
            $sth->bindParam(":tableColName", $tableColName);
            $sth->bindParam(":userIdentifier", $userIdentifier);
            $sth->execute();
    print("PDO::FETCH_ASSOC: ");
    print("Return next row as an array indexed by column name");
    echo "</br>";
    $result = $sth->fetch(PDO::FETCH_ASSOC);
    print_r($result);
    echo "</br>";
    if ($result==null){
        print("FALSE - result is null");
    }else{
        print("TRUE - result isn't null");
    }
?>

Это не работает. Что работает, так это запрос, в котором я указываю имя столбца непосредственно в запросе вместо использования параметра, но я теряю гибкость, которую искал:

<?php
    $dbHost="localhost";
    $dbName="project";
    $dbUser="admin";
    $dbPassword="abcd";
    $dbh=new PDO("mysql:host=$dbHost;dbname=$dbName", $dbUser, $dbPassword);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $userName="apple";
    $sth=$dbh->prepare("SELECT * FROM users WHERE userName = :userIdentifier"); // Cannot be used for userEmail search.
            $sth->bindParam(":userIdentifier", $userName);
            $sth->execute();
    print("PDO::FETCH_ASSOC: ");
    print("Return next row as an array indexed by column name");
    echo "</br>";
    $result = $sth->fetch(PDO::FETCH_ASSOC);
    print_r($result);
    echo "</br>";
    if ($result==null){
        print("FALSE - result is null");
    }else{
        print("TRUE - result isn't null");
    }
?>

Что я делаю не так?

Спасибо

JDelage

1 Ответ

3 голосов
/ 16 июня 2011

+ 1 'за мою любовь к PDO!

Что касается вашего друга проблемы, имена таблиц и столбцов не могут быть переданы в качестве параметров в PDO. См. Этот пост для получения дополнительной информации .

Я считаю, что использование старых добрых переменных (отфильтрованных, конечно!) Сработает хорошо для вас.

 $tableName = "email";
 $sth=$dbh->prepare("SELECT * FROM users WHERE $tableName = :userIdentifier");

        $sth->bindParam(":userIdentifier", $userIdentifier);
        $sth->execute();

Не проверено, но оно должно дать вам старт. Кроме того, не забудьте отфильтровать $ tableName , один (из многих) простой способ сделать это с помощью простого массива, который содержит белый список разрешенных имен таблиц, вот простой пример:

$validTables = array('email', 'username');

if(!in_array($tableName, $validTables)){ 
    throw new Exception("Invalid Table Name");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...