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

Форум MySQL

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

 

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

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

тема: Как поместить в mysql значение NULL?
 
 автор: sasha_ua   (02.01.2011 в 14:17)   письмо автору
 
 

Вот мой запрос б БД:

$category_description = NULL;

$sql2='INSERT INTO local_vm_category(vendor_id, 
category_name, category_description, category_thumb_image,
category_full_image, category_publish, cdate, mdate, 
category_browsepage, products_per_row, category_flypage, 
list_order) values(\''.$vendor_id.'\',\''.
$category_name.'\',\''.$category_description.'\',\''.
$category_thumb_image.'\',\''.$category_full_image.'\',\''.
$category_publish.'\',\''.$cdate.'\',\''.$mdate.'\',\''.
$category_browsepage.'\',\''.$products_per_row.'\',\''.
$category_flypage.'\',\''.$list_order.'\')';
mysql_query($sql2);


Вот дамп двух таблиц:
Правильный вариант.
(3, 1, 'Acer', NULL, NULL, NULL, 'Y', 1282222207, 1282222207, 'browse_1', 1, NULL, 1),

Неправильный, вместо NULL подставляется пустая строка.
(3, 1, 'Acer', 'NULL', '', '', 'Y', 1293964942, 1293964942, 'browse_1', 1, '', 1),

  Ответить  
 
 автор: cheops   (02.01.2011 в 16:09)   письмо автору
 
   для: sasha_ua   (02.01.2011 в 14:17)
 

Ну да, все верно, а в чем вопрос заключается?

  Ответить  
 
 автор: sasha_ua   (02.01.2011 в 16:48)   письмо автору
 
   для: cheops   (02.01.2011 в 16:09)
 

Вопрос - Как мне поместить именно NULL а не пустую строку?

Да я пробовал делать так:
$category_description = NULL;
$sql2='INSERT INTO local_vm_category(vendor_id, 
category_name, category_description, category_thumb_image, 
category_full_image, category_publish, cdate, mdate, 
category_browsepage, products_per_row, category_flypage, 
list_order) values(\''.$vendor_id.'\',\''.
$category_name.'\',\''.mysql_real_escape_string($category_description).'\',\''.
$category_thumb_image.'\',\''.$category_full_image.'\',\''.
$category_publish.'\',\''.$cdate.'\',\''.$mdate.'\',\''.
$category_browsepage.'\',\''.$products_per_row.'\',\''.
$category_flypage.'\',\''.$list_order.'\')';
mysql_query($sql2);

Эффект тот же..

  Ответить  
 
 автор: Trianon   (02.01.2011 в 16:55)   письмо автору
 
   для: sasha_ua   (02.01.2011 в 16:48)
 

Если хотите null поместить - апострофы ставить не надо.
Апостроф - признак явного символьного (текстового) значения.
null - не символьное значение. По большому счету, null - не значение вообще. null - состояние поля, обозначающее неопределенность (неизвестность) его значения.


Мой комментраий (02.01.2011 в 16:37) с null никак не связан.
Просто отметил грубое нарушение при построении запроса.

  Ответить  
 
 автор: sasha_ua   (03.01.2011 в 14:20)   письмо автору
 
   для: Trianon   (02.01.2011 в 16:55)
 

>Если хотите null поместить - апострофы ставить не надо.
Можно на примере?

  Ответить  
 
 автор: cheops   (03.01.2011 в 14:24)   письмо автору
 
   для: sasha_ua   (03.01.2011 в 14:20)
 

Можно отталкиваться от следующей схемы
<?php
$sql2 
'INSERT INTO local_vm_category(vendor_id, category_name, category_description, '.
'category_thumb_image, category_full_image, category_publish, cdate, mdate, category_browsepage, '.
'products_per_row, category_flypage, list_order) '.
'values(\''.$vendor_id.'\',\''.$category_name.'\',';

if(
$category_description == "NULL"$sql2 .= mysql_real_escape_string($category_description);
else 
$sql2 .= "'".mysql_real_escape_string($category_description)."'";

$sql2 .= ',\''.$category_thumb_image.'\',\''.$category_full_image.'\',\''.$category_publish.'\',\''.$cdate.'\',\''.
$mdate.'\',\''.$category_browsepage.'\',\''.$products_per_row.'\',\''.$category_flypage.'\',\''.$list_order.'\')'
mysql_query($sql2);
?>

  Ответить  
 
 автор: Trianon   (03.01.2011 в 14:32)   письмо автору
 
   для: cheops   (03.01.2011 в 14:24)
 

$category_description == "NULL" не пройдет.

<?

if($category_description === NULL$sql2 .= 'NULL';
else 
$sql2 .= "'".mysql_real_escape_string($category_description)."'";


и как следствие:

<?

$sql2 
.= $category_description === NULL ?  'NULL' "'".mysql_real_escape_string($category_description)."'";

  Ответить  
 
 автор: cheops   (03.01.2011 в 14:41)   письмо автору
 
   для: Trianon   (03.01.2011 в 14:32)
 

Это зависит от того, как переменная $category_description формируется, я думаю chepikmas это знает лучше нас и сформирует адекватное условие, так как вместо "NULL" может быть "null" или "Null" и если это так, следует учесть эти дополнительные случаи. Кроме того, я так понимаю $category_description не единственная переменная требующая подобной обработки - эта обработка также нужна для других подобных переменных.

  Ответить  
 
 автор: Trianon   (03.01.2011 в 15:12)   письмо автору
 
   для: cheops   (03.01.2011 в 14:41)
 

>Это зависит от того, как переменная $category_description формируется, я думаю chepikmas это знает лучше нас и сформирует адекватное условие, так как вместо "NULL" может быть "null" или "Null" и если это так, следует учесть эти дополнительные случаи.

я исходил из поста автора: sasha_ua (02.01.2011 в 14:17)
     
Вот мой запрос б БД:

$category_description = NULL;
[...]

в его же посте (02.01.2011 в 16:48) повторяется аналогичная строка.

Оператор $category_description = NULL; означает, что переменной $category_description присваивается специальное значение null, не являющееся строковым, запись которого одинаково трактуется что большими, что маленькими буквами, и никак не соответствует строке из четырех символов 'NULL'.

Что автор является клоном chepikmas - мне лично неизвестно, и оставлять за ним право на последнюю истину в голову не пришло.
За самим автором, кстати, тоже - уж коль скоро обрисовал условия задачи конкретно, с чего бы от этих условий потом отказываться?



>Кроме того, я так понимаю $category_description не единственная переменная требующая подобной обработки - эта обработка также нужна для других подобных переменных.

Про необходимость обработки остальных переменных согласен целиком и полностью.

  Ответить  
 
 автор: sasha_ua   (03.01.2011 в 15:24)   письмо автору
 
   для: cheops   (03.01.2011 в 14:41)
 

Не разобрался как отвечать всем :)

Вот функция полностью:
function make_category()
{
    $dim = get_max_id("parts","id");
    $query="TRUNCATE TABLE `local_vm_category`";
    mysql_query($query);
    
    for($i=1; $i<=$dim; $i++)
    {
        $cdate = time();
        $mdate = time();
        
        // mysql_real_escape_string
        
        $sql = "SELECT `vendor_id`,`category_name`,`category_description`,
`category_thumb_image`,`category_full_image`,
`category_publish`, `category_browsepage`, 
`products_per_row`, `category_flypage`,`list_order`
FROM `parts` where `id`=$i";
        $res = mysql_query($sql); 
        $row = mysql_fetch_array($res);
        $vendor_id = $row[0];
        $category_name = $row[1];
        if(!$row[2])
        {
            $category_description = NULL;
        }
        else
        {
            $category_description = $row[2];
        }
        $category_thumb_image = $row[3];        // NULL
        $category_full_image = $row[4];            // NULL
        $category_publish = $row[5];
        $category_browsepage = $row[6];
        $products_per_row = $row[7];
        $category_flypage = $row[8];            // NULL
        $list_order = $row[9];

        $sql2='INSERT INTO local_vm_category(vendor_id, category_name, category_description, 
category_thumb_image, category_full_image, 
category_publish, cdate, mdate, category_browsepage, 
products_per_row, category_flypage, list_order) values(\''.
$vendor_id.'\',\''.$category_name.'\',\''.
$category_description.'\',\''.$category_thumb_image.'\',\''.
$category_full_image.'\',\''.$category_publish.'\',\''.
$cdate.'\',\''.$mdate.'\',\''.$category_browsepage.'\',\''.
$products_per_row.'\',\''.$category_flypage.'\',\''.
$list_order.'\')';
        mysql_query($sql2);    
    }
}


Если я правильно понял вы рекомендуете составлять запрос по частям с промежуточными проверками $category_description, т.е. напрямую вставлять NULL в запрос?

т.е. запрос должен выглядеть так:
$sql2 = 'INSERT INTO local_vm_category(vendor_id, 
category_name, category_description, category_thumb_image, 
category_full_image, category_publish, cdate, mdate, 
category_browsepage, products_per_row, category_flypage, 
list_order) values(\''.$vendor_id.'\',\''.
$category_name.'\',''NULL'',\''.
$category_thumb_image.'\',\''.$category_full_image.'\',\''.
$category_publish.'\',\''.$cdate.'\',\''.$mdate.'\',\''.
$category_browsepage.'\',\''.$products_per_row.'\',\''.
$category_flypage.'\',\''.$list_order.'\')';

?
NULL обрамляется двумя одинарными кавычками с каждой стороны?

chepikmas - кто это?

  Ответить  
 
 автор: cheops   (03.01.2011 в 16:32)   письмо автору
 
   для: sasha_ua   (03.01.2011 в 15:24)
 

>chepikmas - кто это?
Извиняюсь, не тот ник скопировал :)))

  Ответить  
 
 автор: Trianon   (03.01.2011 в 19:16)   письмо автору
 
   для: sasha_ua   (03.01.2011 в 15:24)
 

Я бы посоветовал не городить этот ужас, а воспользоваться формой оператора INSERT-SELECT


INSERT INTO TABLE target_table (target_columns,...)
  SELECT source_columns, ...  FROM source_table


Посоветовал бы, если б не одно но.

Возникает сильное подозрение, что общих колонок у этих двух таблиц чересчур много.
А значит модель явно проектировалась левой ногой.
Попытка работать с ключом id таблицы parts, как с непрерывной последовательностью, (если это кончно не явная логическая ошибка) тоже не говорит в пользу модели ничего хорошего.

>NULL обрамляется двумя одинарными кавычками с каждой стороны?

NULL не требуется ничем обрамлять. Это ключевое слово языка.

  Ответить  
 
 автор: sasha_ua   (08.01.2011 в 14:00)   письмо автору
 
   для: Trianon   (03.01.2011 в 19:16)
 

INSERT INTO TABLE target_table (target_columns,...)
  SELECT source_columns, ...  FROM source_table


Такая конструкция подойдет для копирования из локальной базы в удаленную?

  Ответить  
 
 автор: cheops   (08.01.2011 в 14:05)   письмо автору
 
   для: sasha_ua   (08.01.2011 в 14:00)
 

Нет, еще из одной базы данных в другую в рамках одного сервера можно скопировать таблицу, если использовать расширенные имена, включающие названия баз данных. Однако, для развертывания базы данных на удаленном сервере придется создавать SQL-дамп и развертывать его либо при помощи какого-то клиента вроде phpMyAdmin, либо при помощи консольного клиента mysql.

  Ответить  
 
 автор: Trianon   (08.01.2011 в 14:14)   письмо автору
 
   для: sasha_ua   (08.01.2011 в 14:00)
 

>
INSERT INTO TABLE target_table (target_columns,...)
  SELECT source_columns, ...  FROM source_table

>
>Такая конструкция подойдет для копирования из локальной базы в удаленную?
нет, конечно.
Но и ваша функция (03.01.2011 в 15:24) не подойдет точно также.

Такая конструкция производит копирование не из базы в базу, а из таблицы в таблицу.
Базы данных этих таблиц, хотя и могут быть разными, все же должны быть при этом а) созданы на одном сервере, и б) иметь права доступа от одного эккаунта.

Базы с сервера на сервер переносятся через экспорт и последующий импорт дампа.

  Ответить  
 
 автор: sasha_ua   (08.01.2011 в 16:10)   письмо автору
 
   для: Trianon   (08.01.2011 в 14:14)
 

Ясно.

Я делал дамп через mysql, все получилось, но хотелось бы знать каким путем можно пойти. Т.е. помимо phpmyadmin есть еще способы создания/экспорта дампа в удаленную БД?

Как-то так:
mysqldump [OPTIONS] database [tables]

?

Где-то читал что разворачивать удаленную БД путем множества транзакций не оптимально, т.к. хостер может и забанить за множество обращений к БД..

P.S. Я написал функцию которая из локальной таблицы копирует в удаленную, но показывать не буду все равно скажете лажа :)

  Ответить  
 
 автор: cheops   (08.01.2011 в 16:19)   письмо автору
 
   для: sasha_ua   (08.01.2011 в 16:10)
 

Можно, но как правило, удаленный доступ к базе данных провайдера запрещен. Дело в том, что для удаленного доступа необходимо создавать отдельный сетевой аккаунт, который практически никогда не создают, пока вы настоятельно это не попросите. Без этого удаленного аккаунта все попытки удаленной работы бесполезны.

>Где-то читал что разворачивать удаленную БД путем множества транзакций не оптимально, т.к.
>хостер может и забанить за множество обращений к БД..
Если сетевой доступ открыт, то сессия будет одна (да, у некоторых провайдеров имеется ограничение на количество запросов в час, но это ограничение распространяется и на локальные запросы). В любом случае, при создании дампа, вы всегда можете потребовать, чтобы INSERT-запросы были многострочными, а не однострочными - в этом случае это ограничение можно обойти (правда там вступает в действие другое ограничение - на объем одного запроса).

  Ответить  
 
 автор: Trianon   (02.01.2011 в 16:37)   письмо автору
 
   для: sasha_ua   (02.01.2011 в 14:17)
 

к символьным значениям должна применяться функция mysql_real_escape_string()

  Ответить  
Rambler's Top100
вверх

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