Закрытие строки запроса в php

Я пытаюсь настроить запрос через php к базе данных MySQL. В строку запроса я поместил функции и, таким образом, использовал оператор точки (.) с замыканием строки, как показано ниже. Проблема в том, что мой запрос не проходит, и как бы я ни старался, я не могу понять ошибку. Спасибо за любую помощь заранее. :)

$query = "INSERT INTO `foo` (`ip`, `time`, `date`, `reason`) VALUES ('".strval(getUserIpAddr())."', '".$time."', '".$date."', '".$reason."')";

SQL-инъекция...

Niet the Dark Absol 27.03.2019 22:25

Вывели ли вы результирующую строку, чтобы убедиться, что она выглядит корректно? Вы на самом деле выполнение запрос где-то?

Patrick Q 27.03.2019 22:26
Предупреждение: Вы широко открыты для SQL-инъекции и действительно должны использовать параметризованный подготовленные заявления вместо создания запросов вручную. Они предоставляются ЗОП или MySQLi. Никогда не доверяйте никаким данным, особенно тем, которые исходят от клиента. Даже если ваши запросы выполняются только доверенными пользователями, вы все еще рискуете повредить свои данные.
Dharman 27.03.2019 22:26

См. также stackoverflow.com/questions/60174/…

Blackhole 27.03.2019 22:26
"и поэтому использовали оператор точки (.)". Нет! Вы никогда не должны объединять данные в свои операторы SQL, как это. Используйте подготовленные операторы.
Dharman 27.03.2019 22:27

То, что другие конкретно не сказали (и чтобы объяснить немного лучше), это если $reason= "it's a bad idea not to prepare queries" (просто например), потому что вы не готовитесь, вы запрашиваете это it's или, в частности, цитату ' разрушит ваш SQL INSERT INTO foo (reason) VALUES ('it's a bad idea not to prepare queries') Вы видите, как ' завершает другую цитату в вашем SQL INSERT INTO foo (reason) VALUES ('it', теперь у вас есть синтаксическая ошибка, потому что s a bad idea not to prepare queries' просто пугает. Может случиться гораздо хуже, чем это, это всего лишь краткий пример.

ArtisticPhoenix 27.03.2019 22:31

К вашему сведению - my string closures are wrong somewhere - если вы имеете в виду кавычки ', вы не используете их в подготовленных операторах, ваш запрос будет иметь эту форму "INSERT INTO foo (ip,time,date,reason)VALUES(?,?,?,?)" - тогда данные отправляются как отдельный вызов. Это позволяет обойти любые проблемы с цитированием. PS. задний тик — это то, что вы используете для блока code, в комментариях здесь. Поэтому я удалил их, но вы должны сохранить их для таких вещей, как date, которое является зарезервированным словом в MySQL (и многих БД), они просто не подходят к ним в комментарии.

ArtisticPhoenix 27.03.2019 22:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
7
35
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как вы уже должны были знать, ваш код имеет проблемы с безопасностью, поэтому не будем вдаваться в подробности. Я не вижу никакой обработки ошибок в вашем коде, поэтому могу только предположить, что именно поэтому вы не видите ошибки. Чтобы использовать PDO, вам нужен драйвер, загруженный на сервер, так что имейте это в виду. Я повторю, что вы должны использовать подготовленные операторы, вот пример.

$dsn = 'mysql:host=localhost;dbname=testdb';
$username = 'username';
$password = 'password';
$options = array(
    // options that apply to your configuration
); 

try {
    $db = new PDO($dsn, $username, $password, $options);

    $sql = "INSERT INTO foo (`ip`, `time`, `date`, `reason`) 
            VALUES (:ip, :time, :date, :reason)";

    $stmt = $db->prepare($sql);
    $stmt->bindValue(':ip', strval(getUserIpAddr()), PDO::PARAM_STR);
    $stmt->bindValue(':time', $time, PDO::PARAM_STR);
    $stmt->bindValue(':date', $date, PDO::PARAM_STR);
    $stmt->bindValue(':reason', $reason, PDO::PARAM_STR);

    $stmt->execute();
} catch (PDOException $e) {
    echo "Exception: " . $e->getMessage();
}

Большое спасибо! Я ценю помощь каждого. Я обязательно включу эти изменения. Что касается моей первоначальной проблемы, выяснил, почему. Я не увеличивал автоматически свою основную запись, и поэтому в моем столбце идентификатора возникала ошибка дублирования записи. :)

Cui Bono 28.03.2019 18:16

Другие вопросы по теме