Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > Ошибка синтаксиса в БД


Автор: Kolombin 24.1.2011, 14:21
Существует следующая строка кода 
Код

$db->super_query("INSERT INTO " . PREFIX . "_clean (name, path) values " . implode(', ', $inserts));


Она вызывает следующую ошибку:
Код

MySQL Error!
------------------------

The Error returned was:
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 '' at line 1

Error Number:
1064

INSERT INTO dle_clean (name, path) VALUES


Что бы я не делал - ошибка не исчезает, но код вообще-то работает (т.е. в БД заносятся необходимые значения). Я так понимаю, что код написан для более старой версии mysql (у меня 5.1.54 MySQLi), но как избавится от ошибки? Какая может быть разница в данном коде для 4-й версии и 5-й?

Автор: bars80080 24.1.2011, 15:00
дык, у тебя же справа никаких значений нет. эта ошибка не зависит от версии мускл, а только от пользователя, который не может проверить перед вставкой в запрос массив

Автор: Kolombin 24.1.2011, 18:59
Я это так же заметил, но дело в том, что раз в таблицу заносится то, что и должно заноситься по замыслу и содержится как результат работы функции 
Код

. implode(', ', $inserts))
 то я посчитал, что имеет место лишь ошибка синтаксиса...


Я делал всевозможные "манипуляции" (например, убирал "кавычки" после values, смещал их... короче пробовал самое невероятное, но более менее логическое), но ошибка не исчезает.

Автор: skyboy 24.1.2011, 21:56
Цитата(Kolombin @  24.1.2011,  17:59 Найти цитируемый пост)
Я делал всевозможные "манипуляции"

Код

echo "INSERT INTO " . PREFIX . "_clean (name, path) values " . implode(', ', $inserts);

тоже делал? 

Автор: Kolombin 25.1.2011, 14:04
skyboy Нет, так раньше не пробовал, но попробовал сейчас.

Изменения есть... В том смысле, что теперь уже явно ругается на неверный аргумент
Код

86 Warning: implode(): Invalid arguments passed in ........./engine/inc/include/filetree.php on line 65 INSERT INTO dle_clean (name, path) values


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

Автор: gta4kv 25.1.2011, 14:09
эм. покажите ваш
Код

var_dump($inserts);

Автор: Kolombin 25.1.2011, 15:17
Тело всей функции, которая вызывает ошибку и в которой $inserts приобретает свои значения

Код

function php_file_tree_dir($directory, $extensions = array(), $first_call = true) {
    // Recursive function called by php_file_tree() to list directories/files
    global $db;
    // Get and sort directories/files
    if( function_exists("scandir") ) $file = scandir($directory); else $file = php4_scandir($directory);
    natcasesort($file);
    // Make directories first
    $files = $dirs = array();
    foreach($file as $this_file) {
        if( is_dir("$directory/$this_file" ) ) $dirs[] = $this_file; else $files[] = $this_file;
    }
    $file = array_merge($dirs, $files);
    
    // Filter unwanted extensions
    if( !empty($extensions) ) {
        foreach( array_keys($file) as $key ) {
            if( !is_dir("$directory/$file[$key]") ) {
                $ext = substr($file[$key], strrpos($file[$key], ".") + 1); 
                if( !in_array($ext, $extensions) ) unset($file[$key]);
            }
        }
    }
    
    if( count($file) > 2 ) { // Use 2 instead of 0 to account for . and .. "directories"
        if( $first_call ) $first_call = false; 
        foreach( $file as $this_file ) {
            if( $this_file != "." && $this_file != ".." ) {
                if( is_dir("$directory/$this_file") ) {
                    // Directory
                    php_file_tree_dir("$directory/$this_file", $extensions, false);
                } else {
                    // File
                    $directory = $db->safesql($directory);
                    $inserts[] = "('$this_file', '$directory')";
                    $result++;
                }
                if (count($inserts) == $limit_insert) {
                    $db->super_query("INSERT INTO " . PREFIX . "_clean (name, path) values " . implode(', ', $inserts));
                    $inserts = array();
                }
            }
        }
        if(!empty($inserts)) {
            $db->super_query( "INSERT INTO " . PREFIX . "_clean (name, path) values " . implode(', ', $inserts) );
        }
    } else rmdir($directory);
}

Автор: gta4kv 25.1.2011, 15:50
Не надо код.

Непосредственно перед запросом сделайте
Код

var_dump($inserts);


и 

Код

var_dump("INSERT INTO " . PREFIX . "_clean (name, path) values " . implode(', ', $inserts) )


Добавлено через 18 секунд
а вывод сюда

Автор: Kolombin 27.1.2011, 09:05
Код

var_dump($inserts);

возвращает NULL

Код

var_dump("INSERT INTO " . PREFIX . "_clean (name, path) values " . implode(', ', $inserts) );

возвращает ошибку 
Код

Warning: implode(): Invalid arguments passed in ......./engine/inc/include/filetree.php on line 69
string(42) "INSERT INTO dle_clean (name, path) values "

69-я строка - это именно 
Код

var_dump("INSERT INTO " . PREFIX . "_clean (name, path) values " . implode(', ', $inserts) );

Автор: gta4kv 27.1.2011, 09:45
Не улавливаете, не?

Массив $inserts у вас пустой. (NULL) По-этому и implode ругается, ибо передан не массив.

Автор: skyboy 27.1.2011, 10:08
Цитата(gta4kv @  27.1.2011,  08:45 Найти цитируемый пост)
Массив $inserts у вас пустой.

ну, не запутывай человека smile
пустой массив - это array()

Автор: gta4kv 27.1.2011, 10:09
ладно, $inserts вообще не существует smile

Автор: Kolombin 28.1.2011, 16:42
Спасибо всем - буду разбираться.... если возникнут "недоразумения" то,..  попробую еще раз обратиться...

PS: Непонятно, если массив пустой, то как  таблица заполняется все-таки нужными значениями... я же это вижу после завершения выполнения скрипта (пусть даже с ошибкой) в самой таблице... Ладно, пока оставим дальнейшие расспросы - постараюсь сам докопаться - это полезно... еще раз всем спасибо, что не оставили вопрос без внимания

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)