|
|
|
| Вот мой запрос б БД:
$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),
|
| |
|
|
|
|
|
|
|
для: sasha_ua
(02.01.2011 в 14:17)
| | Ну да, все верно, а в чем вопрос заключается? | |
|
|
|
|
|
|
|
для: 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);
|
Эффект тот же.. | |
|
|
|
|
|
|
|
для: sasha_ua
(02.01.2011 в 16:48)
| | Если хотите null поместить - апострофы ставить не надо.
Апостроф - признак явного символьного (текстового) значения.
null - не символьное значение. По большому счету, null - не значение вообще. null - состояние поля, обозначающее неопределенность (неизвестность) его значения.
Мой комментраий (02.01.2011 в 16:37) с null никак не связан.
Просто отметил грубое нарушение при построении запроса. | |
|
|
|
|
|
|
|
для: Trianon
(02.01.2011 в 16:55)
| | >Если хотите null поместить - апострофы ставить не надо.
Можно на примере? | |
|
|
|
|
|
|
|
для: 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);
?>
|
| |
|
|
|
|
|
|
|
для: 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)."'";
|
| |
|
|
|
|
|
|
|
для: Trianon
(03.01.2011 в 14:32)
| | Это зависит от того, как переменная $category_description формируется, я думаю chepikmas это знает лучше нас и сформирует адекватное условие, так как вместо "NULL" может быть "null" или "Null" и если это так, следует учесть эти дополнительные случаи. Кроме того, я так понимаю $category_description не единственная переменная требующая подобной обработки - эта обработка также нужна для других подобных переменных. | |
|
|
|
|
|
|
|
для: 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 не единственная переменная требующая подобной обработки - эта обработка также нужна для других подобных переменных.
Про необходимость обработки остальных переменных согласен целиком и полностью. | |
|
|
|
|
|
|
|
для: 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 - кто это? | |
|
|
|
|
|
|
|
для: sasha_ua
(03.01.2011 в 15:24)
| | >chepikmas - кто это?
Извиняюсь, не тот ник скопировал :))) | |
|
|
|
|
|
|
|
для: 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 не требуется ничем обрамлять. Это ключевое слово языка. | |
|
|
|
|
|
|
|
для: Trianon
(03.01.2011 в 19:16)
| |
INSERT INTO TABLE target_table (target_columns,...)
SELECT source_columns, ... FROM source_table
|
Такая конструкция подойдет для копирования из локальной базы в удаленную? | |
|
|
|
|
|
|
|
для: sasha_ua
(08.01.2011 в 14:00)
| | Нет, еще из одной базы данных в другую в рамках одного сервера можно скопировать таблицу, если использовать расширенные имена, включающие названия баз данных. Однако, для развертывания базы данных на удаленном сервере придется создавать SQL-дамп и развертывать его либо при помощи какого-то клиента вроде phpMyAdmin, либо при помощи консольного клиента mysql. | |
|
|
|
|
|
|
|
для: 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) не подойдет точно также.
Такая конструкция производит копирование не из базы в базу, а из таблицы в таблицу.
Базы данных этих таблиц, хотя и могут быть разными, все же должны быть при этом а) созданы на одном сервере, и б) иметь права доступа от одного эккаунта.
Базы с сервера на сервер переносятся через экспорт и последующий импорт дампа. | |
|
|
|
|
|
|
|
для: Trianon
(08.01.2011 в 14:14)
| | Ясно.
Я делал дамп через mysql, все получилось, но хотелось бы знать каким путем можно пойти. Т.е. помимо phpmyadmin есть еще способы создания/экспорта дампа в удаленную БД?
Как-то так:
mysqldump [OPTIONS] database [tables]
|
?
Где-то читал что разворачивать удаленную БД путем множества транзакций не оптимально, т.к. хостер может и забанить за множество обращений к БД..
P.S. Я написал функцию которая из локальной таблицы копирует в удаленную, но показывать не буду все равно скажете лажа :) | |
|
|
|
|
|
|
|
для: sasha_ua
(08.01.2011 в 16:10)
| | Можно, но как правило, удаленный доступ к базе данных провайдера запрещен. Дело в том, что для удаленного доступа необходимо создавать отдельный сетевой аккаунт, который практически никогда не создают, пока вы настоятельно это не попросите. Без этого удаленного аккаунта все попытки удаленной работы бесполезны.
>Где-то читал что разворачивать удаленную БД путем множества транзакций не оптимально, т.к.
>хостер может и забанить за множество обращений к БД..
Если сетевой доступ открыт, то сессия будет одна (да, у некоторых провайдеров имеется ограничение на количество запросов в час, но это ограничение распространяется и на локальные запросы). В любом случае, при создании дампа, вы всегда можете потребовать, чтобы INSERT-запросы были многострочными, а не однострочными - в этом случае это ограничение можно обойти (правда там вступает в действие другое ограничение - на объем одного запроса). | |
|
|
|
|
|
|
|
для: sasha_ua
(02.01.2011 в 14:17)
| | к символьным значениям должна применяться функция mysql_real_escape_string() | |
|
|
|
|