Я пытаюсь настроить запрос через php к базе данных MySQL. В строку запроса я поместил функции и, таким образом, использовал оператор точки (.) с замыканием строки, как показано ниже. Проблема в том, что мой запрос не проходит, и как бы я ни старался, я не могу понять ошибку. Спасибо за любую помощь заранее. :)
$query = "INSERT INTO `foo` (`ip`, `time`, `date`, `reason`) VALUES ('".strval(getUserIpAddr())."', '".$time."', '".$date."', '".$reason."')";
Вывели ли вы результирующую строку, чтобы убедиться, что она выглядит корректно? Вы на самом деле выполнение запрос где-то?
См. также stackoverflow.com/questions/60174/…
То, что другие конкретно не сказали (и чтобы объяснить немного лучше), это если $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' просто пугает. Может случиться гораздо хуже, чем это, это всего лишь краткий пример.
К вашему сведению - my string closures are wrong somewhere - если вы имеете в виду кавычки ', вы не используете их в подготовленных операторах, ваш запрос будет иметь эту форму "INSERT INTO foo (ip,time,date,reason)VALUES(?,?,?,?)" - тогда данные отправляются как отдельный вызов. Это позволяет обойти любые проблемы с цитированием. PS. задний тик — это то, что вы используете для блока code, в комментариях здесь. Поэтому я удалил их, но вы должны сохранить их для таких вещей, как date, которое является зарезервированным словом в MySQL (и многих БД), они просто не подходят к ним в комментарии.






Как вы уже должны были знать, ваш код имеет проблемы с безопасностью, поэтому не будем вдаваться в подробности. Я не вижу никакой обработки ошибок в вашем коде, поэтому могу только предположить, что именно поэтому вы не видите ошибки. Чтобы использовать 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();
}
Большое спасибо! Я ценю помощь каждого. Я обязательно включу эти изменения. Что касается моей первоначальной проблемы, выяснил, почему. Я не увеличивал автоматически свою основную запись, и поэтому в моем столбце идентификатора возникала ошибка дублирования записи. :)
SQL-инъекция...