|
|
|
| Вот код:
<?php
$query = "SELECT b.name AS b_name
FROM $tbl AS a
LEFT JOIN $tbl2 AS b
ON b.brand = a.brand
WHERE a.id_brand = $_GET[id_brand]";
$brand = mysql_query($query);
if(mysql_num_rows($brand) > 0) // Ошибочное условие, требуется изменение
{
$result = mysql_fetch_array($brand);
//Используется переменная $result
//Отказываем в удалении записи из $tbl
}
else
{
// удаляем запись из $tbl
}
?>
|
Дело в том, что mysql_num_rows($brand) всегда не меньше 1 и по идее необходимо проверить
<?php
$result = mysql_fetch_array($brand);
if(!empty($result['b_name'])) {}
|
Но в последствии $result = mysql_fetch_array($brand); вновь используется.
Вопрос такой, как правильно построить условие и если всеже необходимо использовать mysql_fetch_array($brand), то как вернуться на начало массива.
Спасибо. | |
|
|
|
|
|
|
|
для: aetern
(22.07.2009 в 10:40)
| | что сделать-то хотите? | |
|
|
|
|
|
|
|
для: Trianon
(22.07.2009 в 10:43)
| | Коротко: работа в CMS. Дело в том, что описание брендов, лежит в отдельной таблице от товаров и самое главное, что и управляется отдельно. При удалении товаров, в таблице с брендами продолжают висеть лишние бренды.
Я сравниваю, есть ли такой бренд в товарах и если есть, то бренд не удаляю, если нет, смело даю добро на удаление.
По сути, мне необходимо в условии узнать существование значение массива, однако пройдя по массиву функцией mysql_fetch_array(), я не могу вновь корректно по нему пройти.
Есть ли возможность вернуться в начало массива, или тут надо использовать аргументы функции и по ключам как-то перемещаться? | |
|
|
|
|
|
|
|
для: aetern
(22.07.2009 в 10:55)
| | Вы в курсе, что LEFT JOIN можно применять и в запросах UPDATE и в запросах DELETE?
Сдается мне, ваша задача решается одним SQL-запросом .
DELETE tbls... FROM tbls ... | |
|
|
|
|
|
|
|
для: Trianon
(22.07.2009 в 10:58)
| | нет не в курсе, можно пример? | |
|
|
|
|
|
|
|
|
для: Trianon
(22.07.2009 в 11:02)
| | Попробовал вот так, но безрезультатно.
<?php
$query = "DELETE FROM $tbl_brands
FROM $tbl_brands
LEFT JOIN $tbl_goods
ON $tbl_brands.brand = $tbl_goods.brand
WHERE $tbl_goods.brand IS NULL
AND $tbl_brands.id_brand= $_GET[id_brand]
LIMIT 1";
?>
|
и еще вот так:
<?php
$query = "DELETE FROM $tbl_brands
USING $tbl_brands, $tbl_goods
WHERE $tbl_brands.brand=$tbl_goods.brand
AND $tbl_goods.brand IS NULL
AND $tbl_brands.id_brand=$_GET[id_brand]";
$brand = mysql_query($query);
if($brand)
{
echo 'удалили';
//header("Location: index.php");
}
else
{
echo 'не удалили';
}
?>
|
В первом случае пишет, что не удалили, во втором, что удалили. Но в ОБОИХ случаях не удаляет!!!
Вроде все верно, но не удаляет.
условие $tbl_goods.brand IS NULL по идее должно работать как not exists (...), в чем я немного сомневаюсь.
Подскажите, в чем я не прав и где моя ошибка? | |
|
|
|
|
|
|
|
для: aetern
(22.07.2009 в 16:17)
| | в первом случае DELETE FROM $tbl_brands FROM $tbl_brands может быть?
и еще хорошо ошибки читать
$brand = mysql_query($query);
if($brand)
{
echo 'удалили';
//header("Location: index.php");
}
else
{
echo 'не удалили по причине: '.mysql_error();
}
|
| |
|
|
|
|
|
|
|
для: Рома
(22.07.2009 в 18:53)
| | Согласен насчет ошибок (что надо их читать).
Но все же, здесь нет ошибки, а все равно не удаляет, хоть и пишет, что удалили.
В чем же дело?
$query = "DELETE FROM $tbl_brands
USING $tbl_brands, $tbl_goods
WHERE $tbl_brands.brand=$tbl_goods.brand
AND $tbl_goods.brand IS NULL
AND $tbl_brands.id_brand=$_GET[id_brand]";
|
| |
|
|
|
|
|
|
|
для: aetern
(22.07.2009 в 20:04)
| | Почему же запрос
<?php
$query = "DELETE FROM $tbl_brands
USING $tbl_brands, $tbl_goods
WHERE $tbl_brands.brand=$tbl_goods.brand
AND $tbl_goods.brand IS NULL
AND $tbl_brands.id_brand=$_GET[id_brand]";
?>
|
выполняется, возвращается результат об 1 удаленной записи, однако в БД нет никаких изменений???
Еще этот запрос удаляет именно те поля брендов, которые наоборот есть в обоих таблицах... | |
|
|
|
|
|
|
|
для: Trianon
(22.07.2009 в 11:02)
| | как работает запрос ???
WHERE $tbl_goods.brand IS NULL
| ??? | |
|
|
|
|
|
|
|
для: aetern
(22.07.2009 в 22:26)
| | если $tbl_goods.brand не определено. | |
|
|
|
|
|
|
|
для: Trianon
(22.07.2009 в 22:53)
| | а как сделать: если $tbl_goods.brand отсутствует (см. запрос выше)? | |
|
|
|
|
|
|
|
для: aetern
(23.07.2009 в 00:08)
| | это одно и то же.
Отсутствует - следовательно неопределено. | |
|
|
|
|
|
|
|
для: Trianon
(23.07.2009 в 08:48)
| | Тогда почему в запросе
$query = "DELETE FROM $tbl_brands
USING $tbl_brands, $tbl_goods
WHERE $tbl_brands.brand=$tbl_goods.brand
AND $tbl_goods.brand IS NULL
AND $tbl_brands.id_brand=$_GET[id_brand]";
|
не удаляется строка с $tbl_brands.brand, где $tbl_goods.brand IS NULL ???
Я писал об этом выше, но никто не прокомментировал :-( | |
|
|
|
|
|
|
|
для: aetern
(23.07.2009 в 22:55)
| | Вообще-то я предлагал применять второй вариант DELETE
DELETE [LOW_PRIORITY | QUICK] table_name[.*] [,table_name[.*] ...]
FROM table-references
[WHERE where_definition]
|
причем с LEFT JOIN,
а не тот, что у Вас.
У Вас LEFT JOIN нет , и соответственно логика распадается.
Попробуйте сперва отработать SELECT, который выбрал бы строки к удалению. | |
|
|
|
|
|
|
|
для: Trianon
(24.07.2009 в 11:10)
| | Спасибо за Вашу поддержку. Вот верный вариант:
$query = "DELETE $tbl_brands
FROM $tbl_brands
LEFT JOIN $tbl_goods
ON $tbl_brands.brand = $tbl_goods.brand
WHERE $tbl_goods.brand IS NULL
AND $tbl_brands.id_brand= $_GET[id_brand] ";
|
Вот только как узнать произошло ли удаление? Ведь DELETE в любом случае обработал 1 запись и mysql_query($query) всегда true и = 1 и условие
$brand = mysql_query($query);
if($brand)
{
echo 'удалили';
}
else
{
echo 'не удалили по причине: '.mysql_error();
}
|
всегда выполняется как 'удалили'.
Вот если бы проверить был ли $tbl_goods.brand IS NULL, но как это сделать что-то не соображу. Если бы это был SELECT, то я бы проверил ключ if(empty($brand['brand'])) в таблице $tbl_goods, но с DELETEовским синтаксисом что-то не справляюсь. Подскажите как? | |
|
|
|
|
|
|
|
для: aetern
(24.07.2009 в 22:30)
| | mysql_affected_rows()
нет? | |
|
|
|
|
|
|
|
для: Trianon
(24.07.2009 в 23:21)
| | да
if(mysql_affected_rows()>0)
|
помогло.
Спасибо.
А насчет самого первого вопроса. Можно ли все-таки заново проходить по массиву после mysql_fetch_array(), вдруг понадобиться, или это настолько неграмотно, что не стоит об этом и думать? | |
|
|
|
|
|
|
|
для: aetern
(24.07.2009 в 23:42)
| | mysql_data_seek()
нет? | |
|
|
|
|
|
|
|
для: Trianon
(25.07.2009 в 01:01)
| | Да.
Проверил, отлично работает. Вот пример:
<?php
$query = "SELECT * FROM $table";
$res = mysql_query($query);
while($result = mysql_fetch_array($res))
{
...
}
mysql_data_seek($res, 0);
for($i=0; $i<mysql_num_rows($res); $i++)
{
$result = mysql_fetch_array($res);
...
}
?>
|
| |
|
|
|