mySQLi Prepared Statement Select с символами Escape - PullRequest
1 голос
/ 12 января 2012

Я пытаюсь выбрать из таблицы MySQL, используя подготовленные операторы.Критерий выбора является вводом формы пользователя, поэтому я связываю эту переменную и использую подготовленные операторы.Ниже приведен код:

$sql_query = "SELECT first_name_id from first_names WHERE first_name = ?";
$stmt = $_SESSION['mysqli']->prepare($sql_query);

    $stmt->bind_param('s', $_SESSION['first_name']);
    $stmt->execute();
    $stmt->store_result();

    if ($stmt->num_rows == '1') {
            $stmt->bind_result($_SESSION['first_name_id']);
            $stmt->fetch();
    } else {
            $stmt->close();
            $sql_query = "INSERT INTO first_names (first_name) VALUES (?)";
            $stmt = $_SESSION['mysqli']->prepare($sql_query);
            $stmt->bind_param('s', $_SESSION['first_name']);
            $stmt->execute();
            $_SESSION['first_name_id'] = $_SESSION['mysqli']->insert_id;
    }
    $stmt->close();

Очевидно, мой код просто определяет, существует ли first_name в таблице first_names.Если это так, он возвращает соответствующий идентификатор (first_name_id).В противном случае код вставляет новое имя first_name в таблицу first_names и получает идентификатор insert_id.

Проблема в том, что пользователь вводит имя с помощью escape-символа ('Henry's).Не очень вероятно с именами, но, конечно, работодателей.Когда это происходит, код не выполняется (нет операции выбора или вставки в файлы журнала).Таким образом, кажется, что MySQL игнорирует код из-за escape-символа в переменной.

Как я могу исправить эту проблему?Является ли мой код выше эффективным и правильным для задачи?

Проблема № 2.Затем код продолжается с другой вставкой или обновлением, как показано в приведенном ниже коде:

if (empty($_SESSION['personal_id'])) {
            $sql_query = "INSERT INTO personal_info (first_name_id, start_timestamp) VALUES (?, NOW())";
    } else {
            $sql_query = "UPDATE personal_info SET first_name_id = ? WHERE personal_info = '$_SESSION[personal_id]'";
    }

    $stmt = $_SESSION['mysqli']->prepare($sql_query);
    $stmt->bind_param('i', $_SESSION['first_name_id']);
    $stmt->execute();

    if (empty($_SESSION['personal_id'])) {
            $_SESSION['personal_id'] = $_SESSION['mysqli']->insert_id;
    }
    $stmt->close();

Проблема с кодом выше заключается в том, что я не могу заставить его работать вообще.Я не уверен, есть ли какой-либо конфликт с первой частью сценария, но я попробовал все, чтобы заставить его работать.Нет ошибок PHP и нет вставок или обновлений, показываемых в лог-файлах mySQL из этого кода.Похоже, что строка bind_param в коде может быть там, где сценарий умирает ...

Любая помощь будет очень признательна.

1 Ответ

0 голосов
/ 12 января 2012

Вы должны проверить / выйти из пользовательского ввода перед отправкой в ​​БД.

оформить заказ mysql-real-escape-string ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...