Автор Тема: Проблем с фукнция при изваждане на резултата:  (Прочетена 1460 пъти)

RedIce

  • Напреднали
  • *****
  • Публикации: 162
    • Профил
Здравейте, не съм от най-напредлните в PHP програмирането, но горедолу с малко ровичкане се справям. Направих си едно новинарско модулче, което си работи без проблеми, но ако реша да му дам сортиране и зацикля. Мога да пренапиша нещата и да ги направя по малко по хамалски начин със няколко отделни файла но се дразня защо се получава така.

Проблема ми е в следната функция

Код
GeSHi (PHP):
  1. function module_news() {
  2.   $limit_news = limit_news ;  
  3.   global $database;
  4.   $q = "SELECT * FROM ".TBL_NEWS." WHERE status >= 0 ".$limit_news;
  5.   $result = $database->query($q);
  6.   /* Error occurred, return given name by default */
  7.   $num_rows = mysql_numrows($result);
  8.   if(!$result || ($num_rows < 0)){
  9.      echo "Error";
  10.      return;
  11.   }
  12.   if($num_rows == 0){
  13.      echo "";
  14.      return;
  15.   }
  16. include ($path['modules']."news_module_tables.php");
  17.  
  18. }

Идеята е следната, Чрез файла news_module_tables.php се обработват нещата и се извежда информацията, идеята е ако се направи заяка към news модула извежда само списък с новините и кратак текст, или ако се изпрати ИД-то на новината да извежда пълната новина на отделна страничка.


Всичко работи ОК, до момента в който реша да направя следната промяна:
   
Код
GeSHi (PHP):
  1. $q = "SELECT * FROM ".TBL_NEWS." WHERE status >= 0 ORDER by ID DESC ".$limit_news;

И ми излиза следната грешка: Warning: mysql_numrows(): supplied argument is not a valid MySQL result resource in news_module.php on line xx, което в случая е следния ред:

 $num_rows = mysql_numrows($result);
 
 
Някакви идеи?
« Последна редакция: Apr 10, 2010, 02:19 от VladSun »
Активен

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
1. Дай едно
Код
GeSHi (PHP):
  1. echo $q

2. Там където изпълняваш самата заявка дай
Код
GeSHi (PHP):

3. Това
Код
GeSHi (PHP):
  1. $limit_news = limit_news ;  
не ми харесва - ще работи само и единствено, ако имаш define('limit_news', '.....') някъде по-горе.
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

RedIce

  • Напреднали
  • *****
  • Публикации: 162
    • Профил
Имам файл в който се намират почти всички настройки за самия сайт и в него съм дефинирал  limit_news ; Идеята ми е все пак като реша да правя някакви промени да не обикалям от файл на файл :)

Но като се загледах си открих грешката...
Реших че проблема не ми е от скрипта защото все пак ми извежда краткия резултат но ми прави проблеми със пълната новина... и явно там има нещо омазано.... :) Е така се и оказа... но проблема беше на такова място че просто не очаквах :)

Да не изпадам в подробности...
Благодаря за съдействието :)
Активен

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Би било добре да не ползваш глобални променливи ;)
За достъп до DB обекта най-често използваният шаблон е Singleton - осигурява ти достъп подобен на глобалния, като също така гарантира, че инстанцията на този обект е единствена.

http://en.wikipedia.org/wiki/Singleton_pattern#PHP

Това е "скелетът" - ти си добавяш нови методи и проемнливи, като вече си работиш нормално с тях ($this-> ....)

Примерно ползване:
Код
GeSHi (PHP):
  1. #
  2. function module_news() {
  3. ...
  4. $result = DB::getInstance()->query($q);
« Последна редакция: Apr 10, 2010, 11:41 от VladSun »
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

RedIce

  • Напреднали
  • *****
  • Публикации: 162
    • Профил
Мерси... ще го разгледам по късно :)
Иначе аз принципно ползвам класове и обекти като ползвам $this->

« Последна редакция: Apr 10, 2010, 12:39 от RedIce »
Активен

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Имах предвид, че "скелетът", използва само self (заради статичните методи), но в процеса на разширяване не се ползва self, а $this, защото работиш с инстанция на класа (получена чрез getInstance статичния метод).

Ето един много опростен вариант:

Код
GeSHi (PHP):
  1. final class DB
  2. {
  3. // DB properties/methods
  4.  
  5.    protected $result;
  6.  
  7.    public function query($s)
  8.    {
  9.         $this->result = mysql_query($s);
  10.    }
  11.  
  12.    public function rows()
  13.    {
  14.         return mysql_fetch_assoc($this->result);
  15.    }
  16.  
  17. // Singleton specific properties/methods
  18.  
  19.    protected static $_instance;
  20.  
  21.    private function __construct() { }
  22.  
  23.    private function __clone() { }
  24.  
  25.    public static function getInstance()
  26.    {
  27.      if( self::$_instance === NULL ) {
  28.        self::$_instance = new self();
  29.      }
  30.      return self::$_instance;
  31.    }
  32. }
  33.  
  34. $db = DB::getInstance();
  35. $db->query("select * from table");
  36. while ($row = $db->rows())
  37. {
  38.    print_r($row);
  39. }

Методите за създаване на инстанция (constructor, clone) са нарочно private за да не може да се създаде инстанция, която не е създадена чрез getInstance - методът, който гарантира единственост на инстанцията.
« Последна редакция: Apr 10, 2010, 18:46 от VladSun »
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P