Как запросить мою таблицу, если в поисковом запросе есть апостроф?


Как я могу найти имя в своей таблице, если в имени есть апостроф?

Если я вставлю имя с апострофом, например Ender's Game, в поле поиска появится сообщение об ошибке.

Я уже пробовал решения, предоставляемые в stackoverflow, но я не в состоянии решить эту проблему.

Вот мой код:

$string1  = $_GET['name'];
$quer = "SELECT * FROM info WHERE name = '$string1'";
$q = mysqli_query($conn, $quer);

Если в $_GET['name'] есть апостроф, отображается ошибка.

Как я могу это решить?

Author: mickmackusa, 2018-06-09

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();
}
 2
Author: mickmackusa, 2018-06-27 00:41:54

Код в этой форме уязвим для 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. Это должно быть зарезервировано в качестве последнего средства, но оно есть, если вам это нужно, и это лучше, чем регулярное выражение.

 4
Author: Zenexer, 2018-06-09 08:12:41