2015-12-01 3 views
-1

Простой вопрос. Как заставить запрос работать? Я знаю, что вы не можете напрямую использовать $_POST в запросе. Но я не знаю, как заставить это работать.

$sql = 'SELECT * FROM users WHERE `password` = $_POST[password] AND `username` = $_POST[username]'; 
$result = mysqli_query($link, $sql); 

if (!$result) { 
echo "DB Error, could not query the database\n"; 
echo 'MySQL Error: ' . mysqli_error($link); 
exit; 

Я также попытался с помощью mysqli_real_escape_string так:

$username_sql = mysqli_real_escape_string($link, $_POST['username']); 
    $password_sql = mysqli_real_escape_string($link, $_POST['password']); 

Это не работает, как и планировалось. Как это все еще не работает.

Спасибо,

Майк

+2

Поскольку вы уже используете MySQLi, вы должны сделать это с помощью [подготовленных операторов/переменных связывания] (http://www.php.net/manual/en/function.mysqli-bind-param.php). .. вы не должны вводить введенные пользователем значения непосредственно в строку запроса SQL –

+3

И вы, конечно же, не должны хранить пароли открытого текста в своей базе данных .... использовать встроенный PHP [password_hash()] (http: // www .php.net/ручной/EN/function.password-hash.php)/[password_verify()] (http://www.php.net/manual/en/function.password-verify.php) .... узнайте правильный способ сделать это сейчас, и вам не нужно будет снова изучать его позже. –

+1

Используйте подготовленные заявления, пожалуйста! – rray

ответ

4

использование '' с сравнения строк в MySQL

$username_sql = mysqli_real_escape_string($link, $_POST['username']); 
$password_sql = mysqli_real_escape_string($link, $_POST['password']); 

$sql = "SELECT * FROM users 
WHERE `password` = '$username_sql' AND `username` = '$password_sql'"; 
+1

Спасибо, это работает. Не могли бы вы сказать мне, что я сделал не так? Поэтому я больше не буду делать эту ошибку. – mike

+0

использовать ** '' ** со строковым сравнением MySQL @mike –

+1

, если мой ответ поможет вам принять мой ответ @mike –

0

Вы ответили сами на ваш вопрос. mysqli_real_escape_string() - это путь.

$sql = 'SELECT * FROM users WHERE `password` = "' . mysqli_real_escape_string($_POST[password]) . '" AND `username` = "' . mysqli_real_escape_string($_POST[username]') . '"'; 
+1

mysqli_real_escape_string() не был долгое время, подготовленные операторы/переменные связывания - это путь –

4

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

$sql = 'SELECT * FROM users WHERE `password` = ? AND `username` = ?'; 

$stmt = mysqli_stmt_init($link); 
mysqli_stmt_prepare($stmt, $sql); 
mysqli_stmt_bind_param($stmt, "ss", $_POST['password'], $_POST['username']); 
mysqli_stmt_execute($stmt); 
$result = mysqli_stmt_get_result($stmt); 

while($row = mysqli_fetch_assoc($result){ 
    echo $row['username'] .'<br>'; 
} 
+1

Наконец-то ответ с подготовленными заявлениями хорош. – martinstoeckli

4

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

$stmt = $mysqli->prepare('SELECT * FROM users WHERE `password` = ? AND `username` = ?'); 
$stmt->bind_param("ss", $_POST[password], $_POST[username]); 
$stmt->execute(); 
$stmt->bind_result($result); 
$stmt->fetch(); 
// read the result... 
$stmt->close(); 

Имейте в виду, что пароли не должны храниться простой текст, а не следует использовать функции password_hash() и password_verify().

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