Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » Не работает PDO SELECT

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

oldVsevolod



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть простенький код календаря. Всё работает хорошо, но если обратиться внутри кода через mysql_query, то результат возвращается, а если через PDO, то на этой строчке вся загрузка виснет и дальше ничего не происходит.
Что я упускаю? Если PDO точно такой же запрос написать вне этого кода, то всё обрабатывается.

Код:
 
/* Функция генерации календаря */
function draw_calendar($month,$year){
  /* Начало таблицы */
  $calendar = '<table cellpadding="0" cellspacing="0" class="calendar">';
  /* Заглавия в таблице */
  $headings = array('Понедельник','Вторник','Среда','Четверг','Пятница','Суббота','Воскресенье');
  $calendar.= '<tr class="calendar-row"><td class="calendar-day-head">'.implode('</td><td class="calendar-day-head">',$headings).'</td></tr>';
  /* необходимые переменные дней и недель... */
  $running_day = date('w',mktime(0,0,0,$month,1,$year));
//  $running_day = $running_day - 1;
 
if($running_day == 0) $running_day = 6;
else $running_day = $running_day - 1;
 
  $days_in_month = date('t',mktime(0,0,0,$month,1,$year));
  $days_in_this_week = 1;
  $day_counter = 0;
  $dates_array = array();
  /* первая строка календаря */
  $calendar.= '<tr class="calendar-row">';
  /* вывод пустых ячеек в сетке календаря */
  for($x = 0; $x < $running_day; $x++)
  {
    $calendar.= '<td class="calendar-day-np"> </td>';
    $days_in_this_week++;
  }
  /* дошли до чисел, будем их писать в первую строку */
  for($list_day = 1; $list_day <= $days_in_month; $list_day++)
  {
    $calendar.= '<td class="calendar-day"';
if (date(j)==$list_day) $calendar.=' bgcolor=#ddddff>'; else $calendar.='>';
      /* Пишем номер в ячейку */
      $calendar.= '<div class="day-number">'.$list_day.'</div>';
      /** ЗДЕСЬ МОЖНО СДЕЛАТЬ MySQL ЗАПРОС К БАЗЕ ДАННЫХ! ЕСЛИ НАЙДЕНО СОВПАДЕНИЕ ДАТЫ СОБЫТИЯ С ТЕКУЩЕЙ - ВЫВОДИМ! **/
 
$running_date = $year.'-'.$month.'-'.$list_day;
$query = mysql_query("SELECT * FROM events WHERE date = '$running_date' ");
while($result = mysql_fetch_assoc($query))
 
 
/*    $query = $db->query("SELECT * FROM events WHERE date = '$running_date'");
    while($result = $query->fetch())*/
        {
            
            $calendar.= '<p class="'.$result[event_name].' ('.$result[kto].')" id="test" name="test" onclick=alert(this.className)><font size=3 color=blue>'.$result['zagolovok'].'</font></br></p>';
        }
 
 
 
      $calendar.= str_repeat('<p> </p>',2);
       
    $calendar.= '</td>';
    if($running_day == 6)
    {
      $calendar.= '</tr>';
      if(($day_counter+1) != $days_in_month)
      {
        $calendar.= '<tr class="calendar-row">';
      }
      $running_day = -1;
      $days_in_this_week = 0;
    }
    $days_in_this_week++; $running_day++; $day_counter++;
  }
  /* Выводим пустые ячейки в конце последней недели */
  if($days_in_this_week < 8)
  {
    for($x = 1; $x <= (8 - $days_in_this_week); $x++)
    {
      $calendar.= '<td class="calendar-day-np"> </td>';
    }
  }
  /* Закрываем последнюю строку */
  $calendar.= '</tr>';
  /* Закрываем таблицу */
  $calendar.= '</table>';
   
  /* Все сделано, возвращаем результат */
  return $calendar;
 
}
 

Всего записей: 264 | Зарегистр. 10-11-2015 | Отправлено: 08:40 10-10-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
oldVsevolod
ну кто так делает?

Цитата:
 $db->query("SELECT * FROM events WHERE date = '$running_date'")

скорее всего (не знаю чем пользуетесь)
$db->query("SELECT * FROM events WHERE date = '%s'", $running_date);
 
выснет только на одном запросе или на любом другом тоже?

Всего записей: 15096 | Зарегистр. 20-09-2014 | Отправлено: 08:56 10-10-2016
oldVsevolod



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Только на этом и только здесь. Если мою версию запроса написать просто так в любом другом месте, то всё считывается.
 
Добавлено:
Mavrikii
А тоже не работает

Всего записей: 264 | Зарегистр. 10-11-2015 | Отправлено: 09:42 10-10-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
oldVsevolod

Цитата:
А тоже не работает

начнем с простого - что за класс? где инициализируется $db? что получается, если там же заменить запрос на что то простое?

Всего записей: 15096 | Зарегистр. 20-09-2014 | Отправлено: 09:52 10-10-2016
oldVsevolod



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
стоит IIS с php и мускулом
db через инклуд вначале этого же файла  
и что есть простой запрос? без where? тогда тоже не работает
какой класс имеется ввиду

Всего записей: 264 | Зарегистр. 10-11-2015 | Отправлено: 10:28 10-10-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
oldVsevolod

Цитата:
db через инклуд вначале этого же файла

$db не является глобальной, находится внутри функции..
вы проверили вообще, что проинициализирована?
 
насчет
Цитата:
$db->query("SELECT * FROM events WHERE date = '%s'", $running_date);  

я так у себя в своем хелпере реализую, а вообще, в принципе, лучше через

Код:
$stmt = $db->prepare('SELECT * FROM events WHERE date = :date');
$stmt->execute(['date' => $running_date]);
$data = $stmt->fetch();

 
но виснет скорее всего потому, что входит в бесконечный луп в
Цитата:
while($result = $query->fetch())

сделать перед  
var_dump($query->fetch());
exit;
 
посмотреть что выведет

Всего записей: 15096 | Зарегистр. 20-09-2014 | Отправлено: 10:36 10-10-2016 | Исправлено: Mavrikii, 10:36 10-10-2016
oldVsevolod



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ещё раз. Если написать  

Код:
include "db.php"; //подключение к БД
$db->query("SELECT * FROM events WHERE date = '$running_date'") ;

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

Код:
while($result = $query->fetch())  

Всего записей: 264 | Зарегистр. 10-11-2015 | Отправлено: 13:04 10-10-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
oldVsevolod
Я поэтому и написал, что не вижу инклуда в коде. Так инклудить инициализацию внутри функции не очень хорошо. Если функция вызывается не раз, то каждый вызов будет создавать новое подключение. А если у вас инклуд прямо перед вызовом query под комментом, так вообще ужас - этот блок внутри цикла.

Всего записей: 15096 | Зарегистр. 20-09-2014 | Отправлено: 13:48 10-10-2016 | Исправлено: Mavrikii, 13:49 10-10-2016
oldVsevolod



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
весь код

Код:
 
<style type="text/css">
 
/* календарь */
table.calendar    { border-left:1px solid #0066FF; }
tr.calendar-row  {  }
td.calendar-day  { min-height:80px; font-size:11px; position:relative; } * html div.calendar-day { height:80px; }
td.calendar-day:hover  { background:#eceff5; }
td.calendar-day-np  { background:#eee; min-height:80px; } * html div.calendar-day-np { height:80px; }
td.calendar-day-head { background:#ccc; font-weight:bold; text-align:center; width:120px; padding:5px; border-bottom:1px solid #0066FF; border-top:1px solid #0066FF; border-right:1px solid #0066FF; }
div.day-number    { background:#999; padding:5px; color:#fff; font-weight:bold; float:right; margin:-5px -5px 0 0; width:20px; text-align:center; }
td.calendar-day, td.calendar-day-np { width:120px; padding:5px; border-bottom:1px solid #0066FF; border-right:1px solid #0066FF; }
#test
    {
        cursor: pointer;
    }
 
</style>
 
<?php
 
 
include "db_calendar.php";
 
/* Функция генерации календаря */
function draw_calendar($month,$year){
  /* Начало таблицы */
  $calendar = '<table cellpadding="0" cellspacing="0" class="calendar">';
  /* Заглавия в таблице */
  $headings = array('Понедельник','Вторник','Среда','Четверг','Пятница','Суббота','Воскресенье');
  $calendar.= '<tr class="calendar-row"><td class="calendar-day-head">'.implode('</td><td class="calendar-day-head">',$headings).'</td></tr>';
  /* необходимые переменные дней и недель... */
  $running_day = date('w',mktime(0,0,0,$month,1,$year));
//  $running_day = $running_day - 1;
 
if($running_day == 0) $running_day = 6;
else $running_day = $running_day - 1;
 
  $days_in_month = date('t',mktime(0,0,0,$month,1,$year));
  $days_in_this_week = 1;
  $day_counter = 0;
  $dates_array = array();
  /* первая строка календаря */
  $calendar.= '<tr class="calendar-row">';
  /* вывод пустых ячеек в сетке календаря */
  for($x = 0; $x < $running_day; $x++)
  {
    $calendar.= '<td class="calendar-day-np"> </td>';
    $days_in_this_week++;
  }
  /* дошли до чисел, будем их писать в первую строку */
  for($list_day = 1; $list_day <= $days_in_month; $list_day++)
  {
    $calendar.= '<td class="calendar-day"';
if (date(j)==$list_day) $calendar.=' bgcolor=#ddddff>'; else $calendar.='>';
      /* Пишем номер в ячейку */
      $calendar.= '<div class="day-number">'.$list_day.'</div>';
      /** ЗДЕСЬ МОЖНО СДЕЛАТЬ MySQL ЗАПРОС К БАЗЕ ДАННЫХ! ЕСЛИ НАЙДЕНО СОВПАДЕНИЕ ДАТЫ СОБЫТИЯ С ТЕКУЩЕЙ - ВЫВОДИМ! **/
 
$running_date = $year.'-'.$month.'-'.$list_day;
$query = mysql_query("SELECT * FROM events WHERE date = '$running_date' ");
while($result = mysql_fetch_assoc($query))
 
 
/*    $query = $db->query("SELECT * FROM events WHERE date = '$running_date'");
    while($result = $query->fetch())*/
        {
            
            $calendar.= '<p class="'.$result[event_name].' ('.$result[kto].')" id="test" name="test" onclick=alert(this.className)><font size=3 color=blue>'.$result['zagolovok'].'</font></br></p>';
        }
 
 
 
      $calendar.= str_repeat('<p> </p>',2);
       
    $calendar.= '</td>';
    if($running_day == 6)
    {
      $calendar.= '</tr>';
      if(($day_counter+1) != $days_in_month)
      {
        $calendar.= '<tr class="calendar-row">';
      }
      $running_day = -1;
      $days_in_this_week = 0;
    }
    $days_in_this_week++; $running_day++; $day_counter++;
  }
  /* Выводим пустые ячейки в конце последней недели */
  if($days_in_this_week < 8)
  {
    for($x = 1; $x <= (8 - $days_in_this_week); $x++)
    {
      $calendar.= '<td class="calendar-day-np"> </td>';
    }
  }
  /* Закрываем последнюю строку */
  $calendar.= '</tr>';
  /* Закрываем таблицу */
  $calendar.= '</table>';
   
  /* Все сделано, возвращаем результат */
  return $calendar;
 
}
 
?>
 

Всего записей: 264 | Зарегистр. 10-11-2015 | Отправлено: 14:57 10-10-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
oldVsevolod
И еще раз повторю свой первоначальный вопрос - как $db попадает внутрь функции draw_calendar???
У вас вылетает скрипт, так как $db неопределено, а вывода сообщений об ошибках нет, видимо.

Всего записей: 15096 | Зарегистр. 20-09-2014 | Отправлено: 15:42 10-10-2016 | Исправлено: Mavrikii, 15:53 10-10-2016
oldVsevolod



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
это файлик  db

Код:
 
$opt = array(
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);
 
try {
    $db = new PDO($dsn, $dbuser, $dbpasswd, $opt);
} catch (PDOException $e) {
    die('Подключение не удалось: ' . $e->getMessage());
}
 

А как должно попадать правильно?
 
Вообще тупо обращаюсь просто  
echo draw_calendar($mes,$y);
и всё.

Всего записей: 264 | Зарегистр. 10-11-2015 | Отправлено: 16:34 10-10-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
oldVsevolod

Цитата:
 
А как должно попадать правильно?  

Как аргумент функции, как глобальная переменная, через статический класс и тд и тп. Добавьте внутри функции  
global $db;
И вам читать - http://php.net/manual/ru/language.variables.scope.php

Всего записей: 15096 | Зарегистр. 20-09-2014 | Отправлено: 17:09 10-10-2016
oldVsevolod



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
просто с mysql_query проблем не было

Всего записей: 264 | Зарегистр. 10-11-2015 | Отправлено: 17:46 10-10-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
oldVsevolod

Цитата:
просто с mysql_query проблем не было

Потому что не передаёт ей явно подключение, использует новое или пробует само. Ну и функциональный вызов или как метод класса все же отличаются наличием экземпляра класса.

Всего записей: 15096 | Зарегистр. 20-09-2014 | Отправлено: 17:52 10-10-2016
oldVsevolod



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
так, пробую на примере
 
есть файл, сверху прописан инклуд с подключение к БД
 $db2 = new PDO($dsn, $dbuser, $dbpasswd, $opt);
 
далее в файле инклуд к фалу, где прописана функция (в том фале)
function draw_calendar($month, $year, $dbc, $action = 'none')
где внутри её есть
$ne = $db2->query("SELECT * FROM events WHERE date='%s'",$run);
 
и дальше пытаюсь обратиться
echo draw_calendar($month,$gods, $db2);
 
И снова фиг, я же вроде прописал...
 
Добавлено:

Цитата:
$ne = $dbс->query("SELECT * FROM events WHERE date='%s'",$run);  

конечно $dbc
но и так не работает

Всего записей: 264 | Зарегистр. 10-11-2015 | Отправлено: 18:10 10-10-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
oldVsevolod
Вы плохо читаете что я писал. Я же объяснил в начале, что не знаю что за класс использовали. В моем, самописном, я делаю так для санации данных. Потом же и пример для PDO я тоже привел.
И включите вывод ошибок в браузер - сами все поймете

Всего записей: 15096 | Зарегистр. 20-09-2014 | Отправлено: 18:24 10-10-2016 | Исправлено: Mavrikii, 18:25 10-10-2016
oldVsevolod



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я не использую class
Можно простой тупой пример

Всего записей: 264 | Зарегистр. 10-11-2015 | Отправлено: 18:37 10-10-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
oldVsevolod

Цитата:
Я не использую class  

Используете в случае PDO
По моему вы даже основ языка не знаете. Пример был приведен выше, через prepare и execute.
http://php.net/manual/ru/pdostatement.execute.php  

Код:
$stmt = $db->prepare('SELECT * FROM events WHERE date = :date');  
$stmt->execute(['date' => $running_date]);  
$result = $stmt->fetch();

Но можете оставить как было у вас в начале, проблема была лишь в отсутствии инициализированного экземпляра класса PDO

Всего записей: 15096 | Зарегистр. 20-09-2014 | Отправлено: 18:42 10-10-2016 | Исправлено: Mavrikii, 18:48 10-10-2016
oldVsevolod



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Честно, да, я много не знаю, т.к. больше самоучка на примерах.
И поэтому не понимаю, почему, если в функции написать
 
        include "db.php";    
        $run = $year.'-'.$month.'-'.$list_day;    
        $stmt = $db2->prepare('SELECT * FROM events WHERE date = ate');  
        $stmt->execute(['date' => $run]);  
 
то тоже не работает
инклуд обработался, db2 должно было появится и определиться, ну и всё.... а не работает
 
А вне функции работает.

Всего записей: 264 | Зарегистр. 10-11-2015 | Отправлено: 20:30 10-10-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
oldVsevolod

Цитата:
db2 должно было появится и определиться

И это я вам предложил в начале - сделайте var_dump($db2); в проблемном месте и посмотрите, что выведет. А еще лучше - включите отображение ошибок.
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
В начале скрипта.

Всего записей: 15096 | Зарегистр. 20-09-2014 | Отправлено: 20:57 10-10-2016
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » Интернет » Web-программирование » Не работает PDO SELECT


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru