Как запросить мою таблицу, если в поисковом запросе есть апостроф? - PullRequest
0 голосов
/ 09 июня 2018

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

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

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

Вот мой код:

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

Если в * 1011 есть апостроф*, отображается ошибка.

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

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Лучшая практика, которую вы можете ожидать снова и снова слышать от опытных волонтеров 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's) не будет работать (генерирует $result = NULL), если таблица info содержит более одного столбца (я предполагаю, что он будет работать с одним столбцом, но я не проверял);и он сгенерирует Warning из-за дисбаланса между числом выбранных столбцов из SELECT * и числом назначенных переменных.

Warning: 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();
}
0 голосов
/ 09 июня 2018

Код в этой форме уязвим для SQL-инъекции .Используйте mysqli :: prepare вместо:

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

...