2016-10-05 3 views
-2

Я знаю, что это было опубликовано много раз, и я пробовал почти каждый ответ на этом сайте, но ничего не получится. Всякий раз, когда я пытаюсь запустить процесс регистрации, оператор if пропускается даже после того, как имя пользователя уже выполнено. Вот часть кода:Как проверить, существует ли имя пользователя уже с PHP/MYSQL

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

    $sql = mysql_query("SELECT * FROM users (username, password) WHERE username = '".$username."'") 

if(mysql_num_rows($sql)>0) 
{ 
    echo 'taken'; 
} 

else 
{ 
... 
} 

Я хотел бы также отметить, что я увидел нить кто-то сказал, что у них один и тот же вопрос, как этот, потому что они должны были использовать MySQLi, но ничего кроме этого. Благодарю.

+3

'mysql_query' мертв, он был удален из PHP 7. Пожалуйста, прекратите использовать его и, по крайней мере, используйте' mysqli'. PDO - еще лучший вариант. – tadman

+3

** ПРЕДУПРЕЖДЕНИЕ **: Написание собственного уровня контроля доступа непросто, и есть много возможностей, чтобы заставить его серьезно ошибиться. Пожалуйста, не пишите свою собственную систему аутентификации, если какая-либо современная [инфраструктура разработки] (http://codegeekz.com/best-php-frameworks-for-developers/), например [Laravel] (http://laravel.com/) поставляется с надежной системой аутентификации (https://laravel.com/docs/5.2/authentication). В абсолютном порядке следуйте рекомендациям по безопасности (http://www.phptherightway.com/#security) и ** никогда не храните пароли в виде обычного текста **. – tadman

+0

Могу ли я зарегистрироваться, используя имя пользователя "**' foo 'AND' 0 '=' 1' ** "?(Я хочу зарегистрироваться несколько раз, используя то же имя пользователя.) – spencer7593

ответ

1

MYSQL: Это расширение было устаревшим в PHP 5.5.0, и он был удален в PHP 7.0.0. Вместо этого следует использовать расширение MySQLi или PDO_MySQL.

Mysqli Ссылка: http://php.net/manual/en/mysqli.query.php

PDO Ссылка: http://php.net/manual/en/book.pdo.php

Преимущества использования PDO:

Большинство PHP программисты обнаружили, как использовать MySQLi и MySQL расширения. Тем не менее, объекты данных PHP (PDO) предлагают способы работы с объектами и извлекают подготовленные операторы, которые упрощают работу.

PDO - это инструмент для доступа к базе данных в PHP, который обеспечивает единообразный доступ к нескольким базам данных. Он не поддерживает синтаксис, специфичный для баз данных, но обеспечивает относительно плавное переключение между различными платформами и базами данных, что можно просто сделать, изменив строку соединения.

Ниже представлена ​​небольшая информация о PDO, в основном направленная на программистов, которые все еще используют расширения MySQL и MySQLi, излагая преимущество первого. Различные аспекты будут изучены в следующих нескольких параграфах.

  • Поддержка баз данных

расширение PDO имеет возможность доступа к любой базе данных, которую водитель PDO был написан для. Существует много PDO-драйверов, некоторые из которых включают в себя PDO-драйверы, предназначенные для доступа к Free TDS, Sybase, Microsoft SQL Server, IBM DB2, Firebird/Interbase 6, Oracle Call Interface и PostgreSQL, и многие другие.

Драйверы не доступны автоматически в каждой системе, поэтому вам нужно будет найти доступные драйверы и добавить те, которые вам нужны.

  • Баз данные подключения

Существует различные синтаксические, чтобы установить соединение с базой данных, которые зависят от конкретных баз данных. При использовании PDO вы хотите убедиться, что ваши операции завернуты в блоки try/catch и что вы используете метод исключения.

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

  • Обработка ошибки

PDO позволяет использовать исключения для обработки ошибок, поэтому вы посоветовали обернуть PDO в Try/улове блоках. Таким образом, PDO может быть принудительно введен в соответствующий атрибут режима ошибки, чтобы создать исключение.

Существует три режима молчания (по умолчанию), предупреждения и исключения. Последние два более полезны в программировании DRY. Режим «Предупреждение» полезен для отладки, а режим «исключение» позволяет грациозно обрабатывать ошибки, скрывая данные, которые человек может использовать для использования вашей системы.

  • Вставки и обновления

PDO конденсируется общие операции с базой данных вставки и обновления в простой двухступенчатый процесс: Prepare >> [Bind] >> Execute. С помощью этого метода вы можете в полной мере использовать подготовленные заявления PDO, которые предлагают вам защиту от вредоносных атак посредством SQL-инъекции.

Подготовленные операторы представляют собой предзаказанные операторы SQL, которые могут выполняться несколько раз, отправляя эти данные на серверы. Они выгодны тем, что данные, используемые в заполнителях, автоматически защищены от атак SQL-инъекций.

Следовательно, лучше использовать PDO, и это позволит избежать SQL-инъекций, которые преобладают сейчас в течение нескольких дней.

PDO код, чтобы проверить существует ли имя пользователя и пароли полей в БД:

<?php 
//Connections 
try { 
    $handler = new PDO('mysql:host=localhost;dbname=s','root', '*'); 
    $handler->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
} catch (PDOException $e){ 
    exit($e->getMessage()); 
} 

$name = $_POST['name']; 
$username = $_POST['username']; 
$email = $_POST['email']; 
$password = $_POST['password']; 
$password1 = $_POST['passwordconf']; 
$ip = $_SERVER['REMOTE_ADDR']; 


//Verifcation 
if (empty($name) || empty($username) || empty($email) || empty($password) || empty($password1)){ 
    $error = "Complete all fields"; 
} 

// Password match 
if ($password != $password1){ 
    $error = "Passwords do not match"; 
} 

// Email validation 

if (!filter_var($email, FILTER_VALIDATE_EMAIL)){ 
    $error = "Enter a Valid email"; 
} 

// Password length 
if (strlen($password) <= 6){ 
    $error = "Choose a password longer then 6 character"; 
} 

if(!isset($error)){ 
//no error 
$sthandler = $handler->prepare("SELECT username FROM users WHERE username = :name"); 
$sthandler->bindParam(':name', $username); 
$sthandler->execute(); 

if($sthandler->rowCount() > 0){ 
    echo "User Already Exists."; 
} else { 
    //Securly insert into database 
    $sql = 'INSERT INTO users (name ,username, email, password, ip) VALUES (:name,:username,:email,:password,:ip)';  
    $query = $handler->prepare($sql); 

    $query->execute(array(

    ':name' => $name, 
    ':username' => $username, 
    ':email' => $email, 
    ':password' => $password, 
    ':ip' => $ip 

    )); 
    } 
}else{ 
    echo "error occured: ".$error; 
    exit(); 
} 

Надежда так что ссылка может быть полезна для Вас, чтобы разработать коды в будущем проекте самостоятельно.

+0

Спасибо за это. После прочтения вашего сообщения я, безусловно, переключился на PDO, как только найду бесплатный/дешевый хост, который поддерживает php 7 (в настоящее время использует 000webhost и поддерживает только php 5.1). –

+0

Мне нужно знать причину моего голосования на этот ответ. Пожалуйста, оправдайте –

+0

Извините, не был ли я, кто вас ниспровергал ... –

-6

Этот код не является надежным. Перед использованием вы должны подготовить данные о доходе. Не менее:

$username = addslashes(strip_tags($_POST['username'])); 
+4

Нет, нет, ** НЕТ **. 'addslashes' - это не инструмент для использования, а' strip_tags' - это просто глупость. Если вы не можете использовать подготовленные операторы с значениями-заполнителями, то ** только ** приемлемое решение здесь - это функция экранирования, такая как 'mysql_real_escape_string'. Извините за то, что вы так жестоки, но эту дезинформацию нужно решить. – tadman

+4

Это ужасное, ужасное предложение. Для любви ко всему, что хорошо и красиво в этом мире, используйте * подготовленные заявления * с * bind placholders *. И если это невозможно, по какой-то непостижимой причине, потенциально гнусный контент, включенный в текст SQL, должен быть * правильно экранирован *. Использование «добавок» и «strip_tags» для выполнения экранирования выходит за рамки неприемлемого; это непростительно. Используйте функцию, специально предназначенную для этой цели, например. 'Mysqli_real_escape_string'. – spencer7593

2

Это не самое элегантное решение. Но он проверяет, существует ли имя пользователя.

if (isset($_POST["username"]) && isset($_POST["password"])) { 
    $username = $_POST["username"]; 
    $password = $_POST["password"]; 
    $stmt = $this->db->prepare('SELECT COUNT(*) FROM yourtable WHERE username=?'); 
    $stmt->bind_param("s", $username); 
    $stmt->execute(); 
    $get_instances = NULL; 
    $stmt->bind_result($get_instances); 
    $instances = NULL; 
    while ($stmt->fetch()) { 
     $instances = $get_instances; 
    } 
    $stmt->close(); 

    if ($instances == 0) { 
     //whatever you want to happen   
    } 
} 
+0

Этот учебник может быть полезен для размещения вышеуказанного кода в контексте: https://www.raywenderlich.com/2941/how-to-write-a-simple-phpmysql-web-service-for-an-ios-app –

+0

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

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