@MrDungeon

Почему выскакивает ошибка #1064 при выполнении SQL запроса INSERT INTO?

Есть php скрипт, выполняющий запрос, добавляющий данные в БД (таблица price) из файла price.txt. При выполнении INSERT INTO `price` VALUES выдается ошибка:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''Poi',2,1000,1500,2000,4000)' at line 1

Файл price.txt содержит данные в таком виде:

'Poi',2,1000,1500,2000,4000,

Вот полностью код php скрипта:
<?
include "connection.php";

$arr = file("price.txt");

$query = "INSERT INTO `price` VALUES ";
$i = 1;
foreach($arr as $line)
{
	$number = explode(",", $line);
	$order = "($i,";
	foreach($number as $num)
	{
		$order .= "$num,";
	}
	$order = substr($order,0,strlen($order) - 3).")";
	$query .= "$order,";
	$i++;
}
$query = substr($query,0,strlen($query) - 1);
if(!mysql_query($query))
{
	echo $query."<br>";
	echo "Oshibka - ".mysql_error();
}
?>


Создание таблицы:
CREATE TABLE `price` (
`N` int not null auto_increment,
`title` char(200) not null,
`duration` int not null,
`localsum` char(100) not null,
`regionsum` char(100) not null,
`rfsum` char(100) not null,
`intersum` char(100) not null,
INDEX(`N`)
) ENGINE=MyISAM DEFAULT CHARSET="utf8";

Сразу скажу, что я уже много искал, ничего из найденного мне не помогло (таблицу пересоздавал, литералы стоят в ' ', название таблицы взято в ``, даже указывал все параметры - все одинаково, ошибка не уходит). Если ' ' убрать, то возникает ошибка Unknown column 'Poi' in 'field list'.

***************************************************
Проблема решена, достаточно было изменить кодировку файла price.txt на ANSI 1251. Спасибо за помощь!
  • Вопрос задан
  • 47986 просмотров
Решения вопроса 1
скопировал ваш запрос, преобразовал кодировку в ANSI, получил:
INSERT INTO `price` VALUES (10,п»ї'Poi',2,1000,1500,2000,4000)
"п»ї" мускулю и не нравится
а запрос все равно не верный, вы передаете 7 параметров, а в таблице 6 колонок.
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
shaks
@shaks
во первых запрос должен иметь примерно такой формат:
INSERT INTO `price` (`N`, `title`, `localsum`, `regionsum`, `rfsum`, `intersum`) VALUES  (1,'Poi',2,1000,1500,2000,4000)

обрати внимание, что кол-во полей не то, кол-во данных которые вставляются не соответствует кол-ву полей
во вторых у вас тип данных не правильный

`localsum` char(100) not null,
`regionsum` char(100) not null,
`rfsum` char(100) not null,
`intersum` char(100) not null,

эти поля должны быть int а не char
Если вы хотите именно строку, то цифры (при вставке) нужно оборачивать в кавычки

в третьих, раз `N` int not null auto_increment, то значение N можно или игнорировать при вставке, или передавать NULL

P.S. Строку вставки можно делать так:
INSERT INTO `price` SET `field`=1, `field2`=2, `field3`=3

так визуально понятней что куда вставляется

------
UPD
<?php
// соединение с базой:
chdir(dirname(__FILE__));
$dsn = 'mysql:host=localhost'.
    ';dbname=temp_development'.
    ';port='.
    ';connect_timeout=15';

$user = 'root';
$password = '123qwe#';
$db = new PDO($dsn, $user, $password);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);



$file = "./price.txt";# 'Poi',2,1000,1500,2000
# в файле я убрал последнее значение, т.к. для него нет соответствующей колонки в ДБ
if($fp = fopen($file, 'r'))
{
    $sql = "INSERT INTO `price` (`title`, `localsum`, `regionsum`, `rfsum`, `intersum`) VALUES ";
    $prepare = array();
    $insert = array();
    while($line = fgets($fp))
    {
        $line = trim($line);
        if(!$line)
            continue;
        # Читаю файл построчно, чтоб память не загадилась если файл содержит оч много данных

        // валидацию данных я не делаю
        array_push($prepare, implode(",", array_fill(0, 5, "?")));
        $insert = array_merge($insert, explode(",", $line));

    }
    $pr = $db->prepare($sql."( ".implode("), (", $prepare)." )");
    $pr->execute($insert);
}

этот код сгенерирует такой вот запрос в бд:
INSERT INTO `price` (`title`, `localsum`, `regionsum`, `rfsum`, `intersum`) VALUES ( '\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000' )
Ответ написан
Melkij
@Melkij
PostgreSQL DBA
Ну вот примерно так и должны страдать те, кто допускает sql-инъекции. К сожалению, страдают слишком редко.
Ответ написан
Комментировать
EagleMoor
@EagleMoor
PHP Yii2 RESTful API Developer
INSERT INTO `price` VALUES (1,'Poi',2,1000,1500,2000,4000)


вот id передавать не нужно, это и так auto_increment
Ответ написан
@MrDungeon Автор вопроса
Shaks: Вот результат


INSERT INTO `price`(`N`, `title`, `localsum`, `regionsum`, `rfsum`, `intersum`) VALUES (1,'Poi','2','1000','1500','2000','4000')

Oshibka - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''Poi','2','1000','1500','2000','4000')' at line 1


И какие бы кавычки я не ставил - ничего не меняется.
Ответ написан
У тебя в таблице 6 полей, а в запросе передаешь 7.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы