2013-07-17 9 views
-1

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

ниже код:

<?php 
session_start(); 
$host  = "localhost"; 
$username = "root"; 
$password = "123"; 
$dbname = "test"; 
$conn = new PDO("mysql:host=$host;dbname=$dbname",$username,$password); 
?> 

<?php 
if(isset($_POST['register'])){ 
$username = $_POST['username']; 
$password = $_POST['password']; 
$email = $_POST['email']; 

    $usernamecheck = $conn->query("SELECT `id` FROM `user` WHERE     username='$username'"); 
    $emailcheck = $conn->query("SELECT `id` FROM `user` WHERE email='$email'"); 
    if(mysql_num_rows($usernamecheck) > 0){ 
     echo "That username is already taken"; 
    }elseif(mysql_num_rows($emailcheck) > 0){ 
     echo "That e-mail address is already in use"; 
}  
?> 

Ошибки я получаю в двух следующих строках:

если (mysql_num_rows ($ usernamecheck)> 0) {

} ElseIf (mysql_num_rows ($ emailcheck)> 0) {

Спасибо заранее.

+1

См. Http://stackoverflow.com/questions/2304315/get-number-of-rows-from-a-select-statement, но учтите, что в настоящее время вы получаете _none_ преимущества использования PDO, поскольку вы не используя параметризованные запросы. Ваш код по-прежнему уязвим для SQL-инъекций. –

+0

Я настоятельно рекомендую [чтение этого урока] (http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers) –

+1

Вы не можете смешивать функции mysql_ и PDO вместе. Ручки базы данных не взаимозаменяемы. Выберите тот или другой. Не оба. – Charles

ответ

0

Вы используете mysql_num_rows() для запроса PDO. Вы не можете смешивать эти API.

Вы также интерполируете переменные $ _POST непосредственно в ваш SQL-код, который для безопасности является no-no. Преимущество использования PDO заключается в том, что вы можете легко использовать параметры SQL-запросов, что намного проще и безопаснее.

Вот как я бы закодировать эту задачу:

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$stmt = $conn->prepare("SELECT COUNT(*) AS count FROM `user` WHERE username=?"); 
$stmt->execute(array($username)); 
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
    $username_count = $row["count"]; 
} 
if ($username_count > 0) { 
    echo "That username is already taken"; 
} 

$stmt = $conn->prepare("SELECT COUNT(*) AS count FROM `user` WHERE email=?"); 
$stmt->execute(array($email)); 
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
    $email_count = $row["count"]; 
} 
if ($email_count > 0) { 
    echo "That email address is already in use"; 
} 

держать Также в виду, что даже если вы проверяете первый, вы должны предположить, что когда-нибудь два человека, возможно, пытается создать такое же имя пользователя одновременно, и если код для их соответствующих запросов выполняется только в неправильной последовательности, им может быть сказано, что имя пользователя не существует, и продолжайте и ВСТАВЬТЕ его. Поэтому вы должны определить UNIQUE KEY для столбцов, которые должны быть уникальными. Только первый для INSERT будет успешным, а другой получит ошибку. Поэтому вы должны проверить наличие ошибок.

+0

привет спасибо за ответ ... у меня вопрос о вашем ответе ... что вы подразумеваете под интерполяционными переменными $ post? это когда я попытался выполнить следующее: $ emailcheck = $ conn-> query ("SELECT' id' FROM 'user' WHERE email = '$ email'"); Заранее спасибо –

+0

Да, интерполяция - это когда вы помещаете переменную внутри другой строки, подобной этой инструкции SQL, а PHP заменяет имя переменной своим значением. В моем примере выше нет интерполяции, когда я использую заполнители параметров '?'. –

Смежные вопросы