В моей таблице у меня есть запрос:
$sql="SELECT * FROM `jom_x1_organizatori`
WHERE Organizator='".$sta_dalje."' Order by `Struka`,`Zanimanje`";
$sta_dalje
= $ _ POST [«state_id»] из другой таблицы и значение:
В случае 1 работает.
Как сделать запрос?
Первое. Никогда не создавайте запрос, объединяя строку запроса с пользовательским вводом! Если вы это сделаете, тогда экранируйте ввод с помощью специальной функции библиотеки (mysqli_real_escape_string
например). Не спасаясь, вы откроете потенциальную дыру в безопасности (называется SQL-инъекция).
"ПРИМУС" Градишка
не работает, потому что после объединения запрос будет недействительным. А теперь представьте, что произойдет, если я отправлю следующий вход: '; DROP TABLE jom_x1_organizatori; --
Ваш запрос будет:
SELECT * FROM `jom_x1_organizatori`
WHERE Organizator=''; DROP TABLE jom_x1_organizatori; --' Order by `Struka`,`Zanimanje`
Всякий раз, когда вы можете использовать prepared statements
связывать параметры (и позволить библиотеке выполнять тяжелую работу), но всегда экранировать и проверять ввод (используя подготовленные операторы, экранирование выполняется библиотекой)!
$sta_dalje = (sting)$_POST["state_id"]; // Do filtering, validating, force type convertation, etc!!
// Prepare the statement (note the question mark at the end: it represents the parameter)
$stmt = $mysqlLink->mysqli_prepare(
"SELECT * FROM `jom_x1_organizatori` WHERE Organizator = ?");
// Bind a string parameter to the first position
$stmt->bind_param("s", $sta_dalje);
Для получения дополнительной информации о подготовленных заявлениях:
Обратите внимание, что старый mysql
расширение не рекомендуется, не используйте его, если не нужно!
Просто примечание
Не использовать SELECT * FROM
Всегда перечисляйте столбцы. Это предотвращает запрос ненужных данных, и ваш код будет более устойчивым к изменениям базы данных, плюс отладка будет немного проще.
Используйте escape-строку
$sta_dalje = mysqli_real_escape_string($con, $_POST["state_id"]);
И ваше состояние может быть просто
Organizator='$sta_dalje'