Как запросить мою таблицу, если в поисковом запросе есть апостроф?
Как я могу найти имя в своей таблице, если в имени есть апостроф?
Если я вставлю имя с апострофом, например Ender's Game
, в поле поиска появится сообщение об ошибке.
Я уже пробовал решения, предоставляемые в stackoverflow, но я не в состоянии решить эту проблему.
Вот мой код:
$string1 = $_GET['name'];
$quer = "SELECT * FROM info WHERE name = '$string1'";
$q = mysqli_query($conn, $quer);
Если в $_GET['name']
есть апостроф, отображается ошибка.
Как я могу это решить?
2 answers
Лучшая практика, которую вы можете ожидать снова и снова от знающих добровольцев StackOverflow, заключается в использовании подготовленных инструкций для обеспечения безопасности и надежности запросов.
В вашем случае я рекомендую следующий фрагмент, который не только безопасно выполняет ваш запрос SELECT
, но также предоставляет информативные диагностические/отладочные контрольные точки на протяжении всего процесса и позволяет обрабатывать набор результатов, представленный многомерным ассоциативным массив.
$_GET['name'] = "vinay's name";
$string1 = $_GET['name'];
if (!$conn = new mysqli("host", "user", "pass", "db")) {
echo "Database Connection Error: " , $conn->connect_error; // do not show this to public
} elseif (!$stmt = $conn->prepare("SELECT * FROM info WHERE name = ?")) {
echo "Prepare Syntax Error: " , $conn->error; // do not show this to public
} elseif (!$stmt->bind_param("s", $string1) || !$stmt->execute()) {
echo "Statement Error: " , $stmt->error; // do not show this to public
}else{
$result = $stmt->get_result();
while($row = $result->fetch_array(MYSQLI_ASSOC)){
var_export($row); // do what you like here
}
}
Важно отметить, что использование $stmt->bind_result($result)
(как в ответе Zenexer) не будет работать (генерирует $result = NULL
), если таблица info
содержит более одного столбца (я предполагаю, что она будет работать с одним столбцом, но я не проверял); и она будет генерировать предупреждение из-за дисбаланса между количеством выбранных столбцов из SELECT *
и количеством назначенных переменных.
Предупреждение: mysqli_stmt::bind_result(): Количество переменных привязки не совпадает с количеством поля в подготовленном заявлении
Если вы хотите воспользоваться преимуществами явной привязки переменной результата, вам следует указать нужные столбцы в предложении SELECT
следующим образом:
if (!$conn = new mysqli("host", "user", "pass", "db")) {
echo "Database Connection Error: " , $conn->connect_error; // do not show this to public
} elseif (!$stmt = $conn->prepare("SELECT id FROM info WHERE name = ?")) {
echo "Prepare Syntax Error: " , $conn->error; // do not show this to public
} else {
if (!$stmt->bind_param("s", $string1) || !$stmt->execute() || !$stmt->bind_result($id)) {
echo "Statement Error: " , $stmt->error; // do not show this to public
} else {
while ($stmt->fetch()) {
echo "<div>$id</div>";
}
}
$stmt->close();
}
Код в этой форме уязвим для SQL-инъекции . Используйте mysqli::подготовьте вместо:
$string1 = $_GET['name'];
$quer = "SELECT * FROM info WHERE name = ?";
$stmt = $conn->prepare($quer);
$stmt->bind_param('s', $string1);
$stmt->execute();
$stmt->bind_result($result);
$stmt->fetch();
$stmt->close();
var_export($result);
Если вы адаптируете устаревший, небезопасный код, возможно, будет быстрее использовать mysqli_real_escape_string. Это должно быть зарезервировано в качестве последнего средства, но оно есть, если вам это нужно, и это лучше, чем регулярное выражение.