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

Форум MySQL

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

 

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

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

тема: Проблема в связке PDO,SELECT,Limit
 
 автор: hk416   (09.11.2012 в 00:16)   письмо автору
 
 

Доброе время суток уважаемые господа. В общем есть вот такой простой Select, и он должен работать но почему то не работает, и я не знаю где ошибка. Другие такие же запросы у меня работают но вот как пришлось применить Limit, дело не заработало.


$data = array('id_topic_list' => $id_topic_list,'part' => $part,'part2' => $part2);  
$STH = $DBH->prepare("SELECT * FROM list_discussions WHERE id_topic_list= :id_topic_list LIMIT :part,:part2");  
$STH->execute($data);

А вот код то что ниже уже работает, но мне больше нравится стиль с массивом, в чем ошибка скажите плиззз. И ещё хотелось бы знать в чем принципиальная разница этих двух подходов, и какой из них в принципе лучше. Если нечем, то первый короче чем 2 однозначно.
        

        $STH = $DBH->prepare("SELECT * FROM list_discussions WHERE id_topic_list= :id_topic_list LIMIT :part,:part2");  
        $STH->bindParam(':id_topic_list', $id_topic_list, PDO::PARAM_INT); 
        $STH->bindParam(':part', $part, PDO::PARAM_INT);
        $STH->bindParam(':part2', $part2, PDO::PARAM_INT);
        $STH->execute();

  Ответить  
 
 автор: Sfinks   (09.11.2012 в 11:40)   письмо автору
 
   для: hk416   (09.11.2012 в 00:16)
 

Лично я вообще PDO не пользуюсь, но если смотреть в ман, то похоже ваш первый вариант должен выглядеть так:
<?php
  $data 
= array( ':id_topic_list' => $id_topic_list
               
':part' => $part
               
':part2' => $part2
               
);
  
$sql 'SELECT * FROM list_discussions WHERE id_topic_list= :id_topic_list LIMIT :part,:part2';
  
$STH $DBH->prepare$sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY) );
  
$STH->execute($data);
проверьте, и найдите 2 принципиальных отличия =)

  Ответить  
 
 автор: hk416   (09.11.2012 в 14:37)   письмо автору
 
   для: Sfinks   (09.11.2012 в 11:40)
 

Дело вот в чем, ваш вариант я уверен что работает, но это скорее вариация с массивом 2-го варианта. А я хочу код то что ниже который работает только с лимитом. Прошерстил инет, народ жалуется на лимит в этом случае, но ответов нету. Благо вариант с биндом работает.


$data = array('id_topic_list' => $id_topic_list);   
$STH = $DBH->prepare("SELECT * FROM list_discussions WHERE id_topic_list= :id_topic_list");   
$STH->execute($data); 

  Ответить  
 
 автор: Sfinks   (09.11.2012 в 16:38)   письмо автору
 
   для: hk416   (09.11.2012 в 14:37)
 

В первую очередь, у вас названия ключей в массиве не правильные.
'id_topic_list' и ':id_topic_list'
Есть разница?

  Ответить  
 
 автор: hk416   (09.11.2012 в 17:01)   письмо автору
 
   для: Sfinks   (09.11.2012 в 16:38)
 

Да это синтаксис такой в PDO, вот пример


$data = array( 'name' => 'Cathy', 'addr' => '9 Dark and Twisty', 'city' => 'Cardiff' );  
$STH = $DBH->prepare("INSERT INTO folks (name, addr, city) values (:name, :addr, :city)");  
$STH->execute($data);


ну и вот по аналогии тоже самое работает, но без лимита, специально ещё раз проверил

    $data = array('id_topic_list' => $id_topic_list);  
        $STH = $DBH->prepare("SELECT * FROM list_discussions WHERE id_topic_list= :id_topic_list");  
        
        $STH->execute($data);
        
        $STH->setFetchMode(PDO::FETCH_ASSOC);    


Вот ссылочка с примерчиками http://habrahabr.ru/post/137664/

Правда вот ещё примеры нашел на другом сайте http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers тут уже как вы выше писали, но и так и так работает.


$stmt = $db->prepare("INSERT INTO table(field1,field2,field3,field4,field5) VALUES(:field1,:field2,:field3,:field4,:field5)");
$stmt->execute(array(':field1' => $field1, ':field2' => $field2, ':field3' => $field3, ':field4' => $field4, ':field5' => $field5));
$affected_rows = $stmt->rowCount();


Проверил вот так, жаль не пашет (((( Одно радует есть другой способ и он работает.

    $data = array(':id_topic_list' => $id_topic_list,':part' => $part,':part2' => $part2);  
        $STH = $DBH->prepare("SELECT * FROM list_discussions WHERE id_topic_list= :id_topic_list LIMIT :part,:part2");  
    
        $STH->execute($data);

  Ответить  
 
 автор: Sfinks   (09.11.2012 в 20:43)   письмо автору
 
   для: hk416   (09.11.2012 в 17:01)
 

Либо лыжи не едут, либо я....

А в чем разница между вашим самым первым листингом, который вы хотели, чтоб заработал, и самым последним, который работает?
Не в том ли, что в первом ключи массива не правильные, а в последнем правильные?

Или вы хотите чтобы работало вопреки ману?

  Ответить  
 
 автор: hk416   (09.11.2012 в 22:13)   письмо автору
 
   для: Sfinks   (09.11.2012 в 20:43)
 

А в чем разница между вашим самым первым листингом, который вы хотели, чтоб заработал, и самым последним, который работает?
Не в том ли, что в первом ключи массива не правильные, а в последнем правильные?


Самый последний листинг он не работает!!!Вот он ниже

 $data = array(':id_topic_list' => $id_topic_list,':part' => $part,':part2' => $part2);   
        $STH = $DBH->prepare("SELECT * FROM list_discussions WHERE id_topic_list= :id_topic_list LIMIT :part,:part2");   
     
        $STH->execute($data);    // ЭТОТ КОД НЕ РАБОТАЕТ !!!!!!!!!!!!!!



 $data = array('id_topic_list' => $id_topic_list,'part' => $part,'part2' => $part2);   
        $STH = $DBH->prepare("SELECT * FROM list_discussions WHERE id_topic_list= :id_topic_list LIMIT :part,:part2");   
     
        $STH->execute($data);    // ЭТОТ КОД ТОЖЕ НЕ РАБОТАЕТ !!!!!!!!!!!!!!

Не тот не другой вариант не работает, а по-моему должен, тем более в одном источнике есть двоеточия в массиве, во втором нет. Но благо есть вариант ниже и он точно работает.


        $STH = $DBH->prepare("SELECT * FROM list_discussions WHERE id_topic_list= :id_topic_list LIMIT :part,:part2");  
        $STH->bindParam(':id_topic_list', $id_topic_list, PDO::PARAM_INT); 
        $STH->bindParam(':part', $part, PDO::PARAM_INT);
        $STH->bindParam(':part2', $part2, PDO::PARAM_INT);
        $STH->execute();        // ЭТОТ КОД  РАБОТАЕТ !!!!!!!!!!!!!!


Но я все таки хочу обратить ваше внимание на тот факт, что те 2 куска кода отличающиеся двоеточиями, отлично работают без лимита, и не работают с Лимитом. А примера такого какой я хочу в нете не нашел.

  Ответить  
 
 автор: tima2010   (07.12.2012 в 16:04)   письмо автору
 
   для: hk416   (09.11.2012 в 22:13)
 

Аналогичная проблема, Вы разобрались почему в Limit не работает?

  Ответить  
 
 автор: hk416   (10.12.2012 в 13:04)   письмо автору
 
   для: tima2010   (07.12.2012 в 16:04)
 

Он работает, но только если использовать вот такой синтаксис


    $STH = $DBH->prepare("SELECT * FROM discussion WHERE id_list_discussions=:id_list_discussions LIMIT :part, :part2");  
    $STH->bindParam(':id_list_discussions', $id_list_discussions, PDO::PARAM_INT); 
    $STH->bindParam(':part', $part, PDO::PARAM_INT);
    $STH->bindParam(':part2', $part2, PDO::PARAM_INT);
    $STH->execute();


Так и пишите если нужен Limit, вот и всё.

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

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