Я прочитал много тем на форуме и не смог решить мою проблему.
Я анализирую XML-файл в цикле foreach, а затем хочу, чтобы проанализированный контент был вставлен в таблицу базы данных.
Все работает нормально, но у меня проблема при вставке в базу данных.
Вот код, чтобы сделать его «понятным»:
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
foreach ($articles->article as $article) {
$article_title = $article->title;
$article_alias = $article->alias;
...
$all_articles .= "('DEFAULT','$article_title','$article_alias'),";
}
$all_articles = rtrim($all_articles, ',');
$query = "INSERT INTO my_table (id,title, alias,) VALUES $all_articles";
Мое поле идентификатора — УНИКАЛЬНОЕ и Автоинкремент.
Я хочу проверить, существует ли поле псевдонима, затем обновить его или создать новую строку.
Я уже проверил ON DUPLICATE KEY UPDATE и REPLACE, но он не соответствует моим потребностям, так как он выполняет повторную проверку только для уникальных ключей, или мое поле псевдонима не подходит, и я не могу его изменить.
Последнее, что я сейчас тестирую, — это сделать SELECT перед INSERT INTO с условием WHERE, чтобы посмотреть на мое поле псевдонимов.
Я хочу задать вам вопрос здесь, и, если вы сможете ответить на него, вы сами найдете ответ на свой вопрос: что произойдет, если:
$article_title
или же $article_alias
содержат, хм, скажем, что-то вроде "YMas's lazy programming skills"
?Позвольте мне помочь вам — ошибка синтаксиса SQL, потому что в этой строке:
$all_articles .= "('DEFAULT','$article_title','$article_alias'),";
вы неправильно экранируете переменные. Бинго, вставка MySQL не удалась.
Правило № 1: ВСЕГДА, всегда правильно обрабатывайте свои входные данные, прежде чем INSERT/UPDATE/DELETE
— то есть с помощью PDO
и подготовленные заявления (лучшие), или старомодные mysqli_real_escape_string()
функция.
Я решил это с помощью другой объединенной таблицы, чтобы иметь возможность использовать ON DUPLICTAE KEY ENTRY в моем поле псевдонима.
Спасибо за то, как помогли!