Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Ошибка при добавлении datetime.
 
 автор: Хулиган   (27.04.2007 в 20:46)   письмо автору
 
 

Здравствуйте.
Проблема с добавлением записи в базу.
Одно из полей записи типа datetime.
Если добавлять запись со значением поля равным
$date_show = "2010-01-01 00:00:00"; то возникает ошибка синтаксиса.
Если значение поля сформировать таким образом:
$date_show = "NOW() + INTERVAL 3 YEAR"; - запись успешно добавляется.

При том, что первый способ успешно работал.... А сейчас поломался.
В чём может быть проблема. Разве "2010-01-01 00:00:00"; - некорректное значение для поля datetime?
Спасибо.

   
 
 автор: cheops   (28.04.2007 в 00:14)   письмо автору
 
   для: Хулиган   (27.04.2007 в 20:46)
 

А как сообщение об ошибке выглядит?

   
 
 автор: Хулиган   (28.04.2007 в 01:51)   письмо автору
 
   для: cheops   (28.04.2007 в 00:14)
 

Ошибка выглядит так:
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 '00:00:00, NOW() + INTERVAL 14 DAY, 'prod', 'Продаю', 'wet', '-', '24365', '2345'' at line 1

Вот код который добавляет запись в БД:


// try to add new
if ( isset($_GET['add']) && $_GET['add']=="1" ){
    $category = $_POST['addcat']; $category_ru = get_ru($category);
    $action = $_POST['addaction']; $action_ru =  get_ru($action);
    $raion = $_POST['addraion']; $raion_ru = get_ru($raion);

    $date_add = "NOW()";
    $date_ex = "NOW() + INTERVAL " .$_POST['addperiod']. " DAY";
    $content = $_POST['area'];  
    $price = $_POST['addprice'];
    $fone = $_POST['addfone'];
    $name = $_POST['addname'];
    $type = $_POST['addtype'];
    if ($type=="controwblack" || strlen($content)>300) $date_show = "2010-01-01 00:00:00";
    //if ($type=="controwblack" || strlen($content)>300) $date_show = "NOW() + INTERVAL 3 YEAR";
    else $date_show = "NOW()";

    $sql_str = "INSERT INTO `premises` VALUES (0,";
    $sql_str.= " '$category',";
    $sql_str.= " '$category_ru',";
    $sql_str.= " $date_add,";
    $sql_str.= " $date_show,";
    $sql_str.= " $date_ex,";
    $sql_str.= " '$action',";
    $sql_str.= " '$action_ru',";
    $sql_str.= " '$content',";
    $sql_str.= " '$price',";
    $sql_str.= " '$fone',";
    $sql_str.= " '$name',";
    $sql_str.= " '$raion',";
    $sql_str.= " '$raion_ru',";
    $sql_str.= " '$type')";

    $link = open_db();
    mysql_query("SET NAMES 'cp1251'");
    $result = mysql_query($sql_str);

    if ( $result == "1" ) {    //added successfully
        if ($date_show == "2020-01-01 00:00:00"){
            Header("Location: /premadd.php?pay=1");
        }
        else{
            Header("Location: /prem.php?r=all");
        }
    }
    else {        //addition failed
        print mysql_error();
        Header("Location: /premadd.php?f=1");
    }
    close_db($link);
    exit;
}

   
 
 автор: Trianon   (28.04.2007 в 10:49)   письмо автору
 
   для: Хулиган   (28.04.2007 в 01:51)
 

Вы пытаетесь подставить в строке $date_show = "2010-01-01 00:00:00"; значение времени, не ограничив его апострофами. Пишите $date_show = "'2010-01-01 00:00:00'";

   
 
 автор: Хулиган   (28.04.2007 в 14:22)   письмо автору
 
   для: Trianon   (28.04.2007 в 10:49)
 

Спасибо. С апострофами работает.
Интересно, почему раньше, 3 месяца назад, без апострофов работало? Этот модуль я отладил полностью и забыл про него т.к. он работал безотказно, а вот сейчас пришлось к нему вернуться. Странно...

   
 
 автор: Trianon   (28.04.2007 в 16:14)   письмо автору
 
   для: Хулиган   (28.04.2007 в 14:22)
 

может быть скрипт никогда не следовал этой ветви условия?

   
 
 автор: Хулиган   (28.04.2007 в 21:00)   письмо автору
 
   для: Trianon   (28.04.2007 в 16:14)
 

скрипт проверялся принудительным прогоном по всем веткам условий.
Мне кажется, это скорее связано с той чрезмерной вольностью, которую позвляет себе php при работе с переменными, например, когда имя переменной можно прямо в строку запихать, а вместо имени затем подставится значение переменной. После с/с++ это как-то диковато выглядит... Видимо и работает также :)

   
 
 автор: Trianon   (28.04.2007 в 21:09)   письмо автору
 
   для: Хулиган   (28.04.2007 в 21:00)
 

На самом деле к тому, как выглядит, быстро привыкаешь.
В php есть дикие (неортогональные) места, в т.ч. и при подстановке переменных в строки, но от содержимого переменных процесс никак не зависит. Скорее от вида имен.

Могу посоветовать быть крайне осторожным с операцией запятая и условной операцией.
Первая почти нигде не работает, вторая имеет совершенно непривычную после C/C++ ассоциативность, к тому же абсолютно неудобную.

Возвращаясь к теме: не могли там апострофы взяться ниоткуда.... что-то Вы недоглядели при тестировании...

   
 
 автор: Хулиган   (28.04.2007 в 21:46)   письмо автору
 
   для: Trianon   (28.04.2007 в 21:09)
 

Ясно, в общем, спасибо за помощь.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования