Проблема с выборкой из Mysql с помощью PDO

Тема в разделе "PHP", создана пользователем Dali, 19 мар 2011.

Модераторы: latteo
  1. Dali

    Dali

    Регистр.:
    7 апр 2006
    Сообщения:
    155
    Симпатии:
    153
    Проблема с выборкой с помощью PDO

    Собственно бьюсь уже второй день мозг кипит... уже замучал гуглу, а проблему так и не решил попытаю счастье у нс на форуме. Собственно есть такой вот скрипт:
    PHP:
    try{
        
    $bdh = new PDO ("mysql:host=$hostname;dbname=$basename"$username$password);
        echo 
    "Соединение установлено<hr></br>";
        while(!
    feof($list)){
            
    $url=trim(fgets($list));        
            
    $content file_get_contents($url);  
            
    preg_match_all("#<li>(.*)</li>#iU",$content,$elements);
            
    $llist $elements[1];
            if (
    $llist){
                
    $first_l array_shift($llist);
                
    $ins "('".$url."', '".$first_l."')";
                echo 
    $ins."<hr><br>";
                
    $insert $bdh->exec("INSERT INTO con_url (dom, url_page) VALUES ".$ins);
                echo 
    "добавленно: ".$insert."<hr><br>";
                
                
    $sql "SELECT * FROM con_url";
                foreach (
    $dbh->query($sql) as $row) {
                    echo 
    $row['id']. '-' .$row['dom']. '-' .$row['url_page'].'<hr />';
                }
                */
                
    print_r($urllist);
            }
        }
        
    $bdh =null;
    } catch( 
    PDOExecption $e ) {
        print 
    "Error!: " $e->getMessage() . "</br>";
    }
    Суть скрипта в том что по урлу из файла грузим документ забираем список данных(получаем массив данных) если это массив не пустой то из него выбираем первый элемент и заносим в таблицу con_url вида:"id / dom / url_page", далее надо потянуть эту строку из мускула чеб получить id строки для записи уже всех остальных элементов массива в другую таблицу con_dom вида "id / m_id(тоесть наш id из таблицы con_url) / url_page".

    И все бы хорошо должно было быть если бы не одно но! после того как я заинсетил первое значение в таблицу я его немогу вытянуть эту строку чеб взять ид для дальнейших извращений пишет вот это:
    Код:
    Notice:  Undefined variable: dbh in Z:\home\test1.ru\www\ant.php on line 39
    Fatal error:  Call to a member function query() on a non-object in Z:\home\test1.ru\www\ant.php on line 39
    А суть вопрос как поправить мой горе скриптиг чеб он работал...

    P/S/ за код если что извиняюсь из меня наверное пхп программер как из .... пуля , есть подозрение что может надо типа закрывать соединение после того как проинсертил тока в мануле по этому сраному PDO не фига об этом не сказанно
     
  2. CnecHa3

    CnecHa3 Постоялец

    Регистр.:
    10 фев 2007
    Сообщения:
    105
    Симпатии:
    20
    Читай внимательно ошибки:
    Notice: Undefined variable: dbh in Z:\home\test1.ru\www\ant.php on line 39
    Fatal error: Call to a member function query() on a non-object in Z:\home\test1.ru\www\ant.php on line 39

    $bdh = new PDO ("mysql:host=$hostname;dbname=$basename", $username, $password);
    ....
    foreach ($dbh->query($sql) as $row)
     
  3. Dali

    Dali

    Регистр.:
    7 апр 2006
    Сообщения:
    155
    Симпатии:
    153
    Я конечно извиняюсь, но такое я уже читал (гуглом пользоваться умею) и если бы мне оно помогла я бы сюда не писал, можно как школьнику ) в пхп, объяснить а лучше написать как правильно строить конструкцию инсерта и выборки конкретно в этом случае.... неужели сложно написать как это должно выглядеть правильно, причем я разделом не ошибся тоже вроде....
    причем если вывести var_dump($bdh); перед foreach выводит object(PDO)#1 (0) тоесть на сколько я понимаю $bdh = объект pdo так чего оно пишет что query() не объект... Ладно буду благодарен если покажете рабочую конструкцию "инсерт селект" в одном скрипте
     
  4. Monterpan

    Monterpan Постоялец

    Регистр.:
    3 мар 2008
    Сообщения:
    150
    Симпатии:
    27
    Я тоже так однажды ступил :)

    $bdh и
    $dbh

    вы буквы перепутали.
     
    Dali нравится это.
  5. chang

    chang

    Регистр.:
    20 ноя 2009
    Сообщения:
    363
    Симпатии:
    117
    забавная опечатка

    инсерт вообще нужно делать как-то так
    PHP:
    $dom "value3";
    $url_page "value4"
     
    $q $bdh->prepare("INSERT INTO con_url (dom, url_page) VALUES (:dom,:url_page)");
    $q->execute(array(':dom'=>$dom':url_page'=>$url_page)); 
    без всяких извращенных конкатенаций строк для составления запроса

    ну и чтоб достать айди последней вставленной записи достаточно непосредственно после инсерта вызвать метод lastInsertId, а не делать SELECT * и искать там последнюю запись

    PHP:
    $lastInsertId =  $bdh->lastInsertId();
    Добавлено через 3 минуты
    ну и в селекте наверн лучше как-то так

    PHP:
    foreach ($bdh->query($sql)->fetchAll(PDO::FETCH_ASSOC) as $row) {
    }
    т.е. задать явно что выбираем записи в ассоциативном массиве ....
    иначе будет возвращен и ассоциативный массив и числовой ( спаренные ) .. - мелочь но прост лишний расход памяти на ненужные данные
     
    Dali нравится это.
  6. CnecHa3

    CnecHa3 Постоялец

    Регистр.:
    10 фев 2007
    Сообщения:
    105
    Симпатии:
    20
    Ни кто не спорит, гооглом все умеют пользоваться :)
    причем если вывести var_dump($bdh); перед foreach выводит object(PDO)#1 (0)
    да, всё верно, но посмотри что у тебя в самом foreach() написано: $dbh, а не $bdh
     
    Dali нравится это.