Преобразование MySQL в PDO - PullRequest
       3

Преобразование MySQL в PDO

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

Мне пару раз приходили посоветовать начать менять свой код на PDO, и я наконец-то дошел до этого.Моя проблема в том, что у меня невероятные трудности с конвертацией существующего сценария входа.Для последних нескольких строк кода ниже (после строки $result = $query->fetchAll();) я не смог найти в Интернете никаких ресурсов, которые могли бы помочь мне переписать его:

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

$db=getConnection();

$username = mysql_real_escape_string($username);

$query = $db->prepare( "SELECT password, salt, 'employer' as user_type
FROM JB_Employer
WHERE Username = '$username'

UNION
SELECT password, salt, 'jobseeker' as user_type
FROM JB_Jobseeker
WHERE User_Name = '$username'");

$result = $query->fetchAll();

$qData = mysql_fetch_array($result, MYSQL_ASSOC);
$hash = hash('sha256', $qData['salt'] . hash('sha256', $password) );

if ($result -> rowcount() <1 ;) { print “Fail, No such user”;}

if ($hash != $qData['password']) { header('Location: register.php?loginStatus=fail');  exit;}

else {$_SESSION['user'] = $username;
$_SESSION['permission'] = $qData['user_type'];}

Может кто-нибудь посоветовать, какЯ мог бы добиться этого?

Ответы [ 2 ]

2 голосов
/ 09 февраля 2012

Взгляните на это и, пожалуйста, еще раз продумайте свой код, особенно в отношении уязвимости XSS!Кроме того, ради хорошего разработчика, реорганизуйте / перепишите свою базу данных.Это ВСЕ, кроме пути.

Кроме того, код не проверен.

<?php

$db = getConnection(); //assuming you are returning a PDO object here!

$username = getUsername(); //assuming you are NOT escaping the username!
$password = getPassword(); //assuming your hashed password here!

$query = "SELECT password, salt, 'emplyer' as user_type
FROM  JB_Employer
WHERE Username = :username

UNION

SELECT password, salt, 'jobseeker' as user_type
FROM JB_Jobseeker
WHERE User_Name = :username";

//$statement == PDOStatement
$statement = $db->prepare($query);

//bind the $username param to :username, this is the real power of PDO,
//no more SQL Injections. Don't use mysql_real_escape-esque things!
//they are not nececary with PDO
$statement->bindParam(":username", $username);

//execute the statement
if($statement->execute()){
    $result = $statement->fetchAll();

    $rowCount = count($result);

    if($rowCount < 1){
        // redirect?
        die("No Such user");
    }else{
        // more than one user can be possible, this is not the correct way, but it appears to be your way so let's continue
        $firstRow = $result[0];

        if( isPasswordEqual($firstRow['salt'], $password) ){
            $_SESSION['user'] = $username; //security risk here. Vulnerable for XXS
            $_SESSION['permission'] = $firstRow['user_type'];
        }else{
            //Don't tell them this! It will give them knowledge of which accounts do exist.
            //Just say some general message like "login failed"
            die("wrong information");
        }
    }
}
0 голосов
/ 09 февраля 2012

Вы должны рассмотреть возможность переименования переменных, чтобы иметь больше смысла.В частности, $db->prepare() возвращает оператор , а не запрос.Вы передаете ему запрос, и он готовит этот запрос и возвращает инструкцию.Если вы будете следовать этому соглашению об именах, это избавит вас от головной боли.

При этом вам следует изменить код:

$result = $query->fetchAll();

$qData = mysql_fetch_array($result, MYSQL_ASSOC);

На это:

$qData = $query->fetch(\PDO::FETCH_ASSOC);

А остальные должны попадать в очередь.PDOStatement::fetch(\PDO::FETCH_ASSOC) возвращает ассоциативный массив, как mysql_fetch_array(..., MYSQL_ASSOC) или mysql_fetch_assoc().

Редактировать: Кроме того, вам необходимо изменить $result->rowCount() на $query->rowCount().

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