конвертировать mysql в оператор PDO - PullRequest
1 голос
/ 03 февраля 2012

Это функция входа, написанная с использованием MySQL Тем не менее, проблема существует, когда он преобразует в PDO способ

MYSQL:

    <?
function confirmUser($username, $password){
   global $conn;
   if(!get_magic_quotes_gpc()) {
    $username = addslashes($username);
   }

   /* Verify that user is in database */
   $q = "select UserID,UserPW from user where UserID  = '$username'";
   $result = mysql_query($q,$conn);
   if(!$result || (mysql_numrows($result) < 1)){
      return 1; //Indicates username failure
   }

   /* Retrieve password from result, strip slashes */
   $dbarray = mysql_fetch_array($result);
   $dbarray['UserPW']  = stripslashes($dbarray['UserPW']);
   $password = stripslashes($password);

   /* Validate that password is correct */
   if($password == $dbarray['UserPW']){
      return 0; //Success! Username and password confirmed
   }
   else{
      return 2; //Indicates password failure
   }
}

PDO:

<?
function confirmUser($username, $password){
   global $conn;

   include("connection/conn.php");

   $sql = '
    SELECT   COALESCE(id,0) is_row
    FROM     user
    WHERE    UserID = ?
    LIMIT 1
';

$stmt = $conn->prepare($sql);
$stmt->execute(array('09185346d'));
$row = $stmt->fetch();

if ($row[0] > 0) {
       $sql = '
    SELECT   COALESCE(id,1) is_row
    FROM     user
    WHERE    UserPW = ?
    LIMIT 1
';
$stmt = $conn->prepare($sql);
$stmt->execute(array('asdasdsa'));
$row = $stmt->fetch();
    if ($row[0] > 0) 
    return 2;
    else
    return 0;
}
elseif ($row[0] = 0)
{return 1;}   



}

В чем проблема ?? И нужно ли включать параметр связывания в PDO ??? БЛАГОДАРЯ

1 Ответ

1 голос
/ 03 февраля 2012

Помимо вашего использования global и вашего include внутри функции (вы должны исследовать альтернативный способ структурирования вашей функции, чтобы этого не делать), я бы изменил код следующим образом:

$sql =
    'SELECT  id
    FROM     user
    WHERE    UserID = ?
    AND      UserPW = ?
    LIMIT 1';

$stmt = $conn->prepare($sql);
$stmt->execute(array(
    '09185346d',
    'asdasdsa'
));

if ($stmt->rowCount() == 1) {
    return 0;
}
else {
    return 1;
}

Объединение запросов, чтобы дать общую ошибку аутентификации, вместо того, чтобы позволить людям опробовать действительные имена пользователей, а затем действительные пароли, а затем с помощью метода PDOStatements rowCount проверить, была ли возвращена ваша строка.

Комуответьте на свою вторую часть, нет необходимости специально использовать bindParam для предотвращения внедрения SQL.

Вот краткий пример различия между bindParam и bindValue

$param = 1;

$sql = 'SELECT id FROM myTable WHERE myValue = :param';
$stmt = $conn->prepare($sql);

Использование bindParam

$stmt->bindParam(':param', $param);
$param = 2;
$stmt->execute();

ВЫБЕРИТЕ идентификатор ИЗ myTable ГДЕ myValue = '2'

Использование bindValue

$stmt->bindValue(':param', $param);
$param = 2;
$stmt->execute();

ВЫБЕРИТЕ idОТ myTable ГДЕ myValue = '1'

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