Возможный дубликат:
Может ли кто-нибудь помочь мне выяснить, что не так с этим кодом?
Вот мой код
$con = mysql_connect("localhost", "root", ''); if (!$con) { die('Cannot make a connection'); } mysql_select_db('yumbox_table', $con) or die('Cannot make a connection'); isset($_POST['user_name'], $_POST['password'], $_POST['user_type']); $data = mysql_query("SELECT * FROM users WHERE user_name == ($_POST['user_name']) AND ($_POST['password']) AND ($_POST['user_type'])") or die(mysql_error()); $info = mysql_fetch_array($data); $count = mysql_numrows($data); if ($count == 1) { echo("Success!!"); } else { echo("BIG FRIGGIN FAILURE!!"); } mysql_close($con);
Всякий раз, когда я запускаю этот код, я получаю следующее сообщение:
Вам нужно избежать значений POST, прежде чем вставлять их в свой запрос. Вы должны избегать значений POST, прежде чем использовать их в запросе базы данных.
Вместо этого:
$data = mysql_query("SELECT * from users where user_name == ($_POST['user_name']) and ($_POST['password']) and ($_POST['user_type'])"
Сделай это:
$user_name = mysql_real_escape_string($_POST['user_name']); $password = mysql_real_escape_string($_POST['password']); $user_type = mysql_real_escape_string($_POST['user_type']); $data = mysql_query("SELECT * FROM users WHERE user_name == '$user_name' AND password == '$password' AND user_type == '$user_type'");
Обратите внимание, что я предполагаю, что ваши столбцы в таблице являются «user_name», «password» и «user_type».
if(isset($_POST['user_name'], $_POST['password'], $_POST['user_type'])){ $data = mysql_query("SELECT * from users where user_name = '".mysql_real_escape_string($_POST['user_name'])."' and password = '".mysql_real_escape_string($_POST['password'])."' and user_type = '".mysql_real_escape_string($_POST['user_type'])."' "); if(mysql_numrows($data) == 1) { $info = mysql_fetch_array($data); echo("Success!!"); } else { echo("BIG FRIGGIN FAILURE!!"); } } else{ echo "Required Data Missing"; } mysql_close($con);
Вы должны отправить сообщение об ошибке для получения более подробной информации. Но кое-что, что я заметил, было
mysql_query("SELECT * from users where user_name == ($_POST['user_name']) and ($_POST['password']) and ($_POST['user_type'])")
Вы должны изменить это на
//do escaping here. See note below. $username = isset($_POST['user_name']) ? mysql_real_escape($_POST['user_name']) : ''; $pass = isset($_POST['password']) ? mysql_real_escape($_POST['password']) : ''; $type = isset($_POST['user_type']) ? mysql_real_escape($_POST['user_type']) : ''; mysql_query("SELECT * from users where user_name = '{$username}' AND password = '{$pass}' AND user_type = '{$type}'")
Вам нужно избегать значений
Сравнение MySQL равно =
и не ==
(спасибо за указание, что вне @jeremysawesome)
Вы должны проверить столбец против значения POST
У вас также есть уязвимость SQL-инъекций . Пожалуйста, по крайней мере, используйте mysql_real_escape . Еще лучше, переключитесь на PDO
Вам необходимо назначить проверку isset
переменной и проверить ее. В противном случае это просто отходы.