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

Форум MySQL

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

 

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

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

тема: правильно обработать полученный запрос
 
 автор: aetern   (22.07.2009 в 10:40)   письмо автору
 
 

Вот код:

<?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), то как вернуться на начало массива.
Спасибо.

  Ответить  
 
 автор: Trianon   (22.07.2009 в 10:43)   письмо автору
 
   для: aetern   (22.07.2009 в 10:40)
 

что сделать-то хотите?

  Ответить  
 
 автор: aetern   (22.07.2009 в 10:55)   письмо автору
 
   для: Trianon   (22.07.2009 в 10:43)
 

Коротко: работа в CMS. Дело в том, что описание брендов, лежит в отдельной таблице от товаров и самое главное, что и управляется отдельно. При удалении товаров, в таблице с брендами продолжают висеть лишние бренды.
Я сравниваю, есть ли такой бренд в товарах и если есть, то бренд не удаляю, если нет, смело даю добро на удаление.
По сути, мне необходимо в условии узнать существование значение массива, однако пройдя по массиву функцией mysql_fetch_array(), я не могу вновь корректно по нему пройти.
Есть ли возможность вернуться в начало массива, или тут надо использовать аргументы функции и по ключам как-то перемещаться?

  Ответить  
 
 автор: Trianon   (22.07.2009 в 10:58)   письмо автору
 
   для: aetern   (22.07.2009 в 10:55)
 

Вы в курсе, что LEFT JOIN можно применять и в запросах UPDATE и в запросах DELETE?

Сдается мне, ваша задача решается одним SQL-запросом .

DELETE tbls... FROM tbls ...

  Ответить  
 
 автор: aetern   (22.07.2009 в 10:58)   письмо автору
 
   для: Trianon   (22.07.2009 в 10:58)
 

нет не в курсе, можно пример?

  Ответить  
 
 автор: Trianon   (22.07.2009 в 11:02)   письмо автору
 
   для: aetern   (22.07.2009 в 10:58)
 

http://www.mysql.ru/docs/man/DELETE.html
второй вариант.

  Ответить  
 
 автор: aetern   (22.07.2009 в 16:17)   письмо автору
 
   для: 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 (...), в чем я немного сомневаюсь.
Подскажите, в чем я не прав и где моя ошибка?

  Ответить  
 
 автор: Рома   (22.07.2009 в 18:53)   письмо автору
 
   для: 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(); 
                          }

  Ответить  
 
 автор: aetern   (22.07.2009 в 20:04)   письмо автору
 
   для: Рома   (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 в 22:01)   письмо автору
 
   для: 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 удаленной записи, однако в БД нет никаких изменений???

Еще этот запрос удаляет именно те поля брендов, которые наоборот есть в обоих таблицах...

  Ответить  
 
 автор: aetern   (22.07.2009 в 22:26)   письмо автору
 
   для: Trianon   (22.07.2009 в 11:02)
 

как работает запрос ???
WHERE $tbl_goods.brand IS NULL
???

  Ответить  
 
 автор: Trianon   (22.07.2009 в 22:53)   письмо автору
 
   для: aetern   (22.07.2009 в 22:26)
 

если $tbl_goods.brand не определено.

  Ответить  
 
 автор: aetern   (23.07.2009 в 00:08)   письмо автору
 
   для: Trianon   (22.07.2009 в 22:53)
 

а как сделать: если $tbl_goods.brand отсутствует (см. запрос выше)?

  Ответить  
 
 автор: Trianon   (23.07.2009 в 08:48)   письмо автору
 
   для: aetern   (23.07.2009 в 00:08)
 

это одно и то же.
Отсутствует - следовательно неопределено.

  Ответить  
 
 автор: aetern   (23.07.2009 в 22:55)   письмо автору
 
   для: 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 ???
Я писал об этом выше, но никто не прокомментировал :-(

  Ответить  
 
 автор: Trianon   (24.07.2009 в 11:10)   письмо автору
 
   для: 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, который выбрал бы строки к удалению.

  Ответить  
 
 автор: aetern   (24.07.2009 в 22:30)   письмо автору
 
   для: 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овским синтаксисом что-то не справляюсь. Подскажите как?

  Ответить  
 
 автор: Trianon   (24.07.2009 в 23:21)   письмо автору
 
   для: aetern   (24.07.2009 в 22:30)
 

mysql_affected_rows()
нет?

  Ответить  
 
 автор: aetern   (24.07.2009 в 23:42)   письмо автору
 
   для: Trianon   (24.07.2009 в 23:21)
 

да
if(mysql_affected_rows()>0)

помогло.
Спасибо.
А насчет самого первого вопроса. Можно ли все-таки заново проходить по массиву после mysql_fetch_array(), вдруг понадобиться, или это настолько неграмотно, что не стоит об этом и думать?

  Ответить  
 
 автор: Trianon   (25.07.2009 в 01:01)   письмо автору
 
   для: aetern   (24.07.2009 в 23:42)
 

mysql_data_seek()
нет?

  Ответить  
 
 автор: aetern   (25.07.2009 в 10:16)   письмо автору
 
   для: Trianon   (25.07.2009 в 01:01)
 

Да.
Проверил, отлично работает. Вот пример:
<?php
$query 
"SELECT * FROM $table";        
$res mysql_query($query);        
    while(
$result mysql_fetch_array($res))
    {
    ...
    }
    
mysql_data_seek($res0);

    for(
$i=0$i<mysql_num_rows($res); $i++)
    {
    
$result mysql_fetch_array($res);
    ...
    }
?>

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

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