PHP ООП с MySQL - PullRequest
       9

PHP ООП с MySQL

1 голос
/ 12 мая 2011

ок. У парней большие проблемы и они не могут понять, что происходит. Пожалуйста, помогите.

Прежде всего, у меня есть класс подключения к БД:

    private $localhost = DB_LOCALHOST;
    private $db = DB_DATABASE;
    private $user = DB_USER;
    private $password = DB_PASSWORD;
    protected $link ;


    function __construct()
      {

       $this->link = mysql_connect($this->localhost,$this->user,$this->password) or die(mysql_error()."<br/>".mysql_errno());
       mysql_query("SET NAMES ".DB_CHARSET , $this->link) or die(mysql_error()."<br/>".mysql_errno());
       mysql_select_db($this->db, $this->link)or die(mysql_error()."<br/>".mysql_errno());
           if($this->link===false)
           die("Didn't connect to DB");            

       }

       function sql_query($q)
       {    
          $r = mysql_query($q, $this->link) or die ("DATABASE ERROR! Please, contact the administrator.".mysql_error().);
          return $r;
       }

        function __destruct()
        {
           mysql_close($this->link);
        }

      }

затем я использую его в другой функции:

     function del_meal($id_meal)
     {
         $db_s = new DBConnect();
     $db_s->sql_query("DELETE FROM `pictures` WHERE `id_target` = '{$id_meal}' AND `type` = 'meal';");
     $db_s->sql_query("DELETE FROM `meal_ingredient` WHERE `id_meal` = '{$id_meal}';"); 
     $db_s->sql_query("DELETE FROM `meal` WHERE `id_meal` = '{$id_meal}';"); 
     unset($db_s);
     $pictures = $this->select_pictures($id_meal,'meal');
         if(count($pictures)>0)
         {
           foreach($pictures as $pic)
           {
            if(file_exists("./pictures/meal/{$pic}"))
             {
               unlink("./pictures/meal/{$pic}");
               unlink("./pictures/meal/thumb/{$pic}");
             }
           }
         }
     }

    function del_category($id_category)
    {
       $db = new DBConnect();
       $id_category = $db->safe_var($id_category);
       $q = $db->sql_query("SELECT * FROM `meal` WHERE `id_category` ='{$id_category}' ");
    while($res = mysql_fetch_assoc($q))
    {
        $this->del_meal($res['id_meal']);
    }
    $db->sql_query("DELETE FROM `meal_category` WHERE `id_category` = '{$id_category}' ");
    unset($db);
    }

хорошо - вот safe_var ()

   function safe_var($var)
  {
      $var = stripslashes($var);
      $var = trim($var);
      $var = strip_tags($var);
      $var = mysql_real_escape_string($var);
      $var = htmlspecialchars($var);
      $var = nl2br($var);

      return $var;
  }

Итак, когда я использую функцию «просто еда» - все хорошо, но когда я использую категорию «дель» - Я получаю "Предупреждение: mysql_query (): 7 не является допустимым ресурсом MySQL-Link в DBConnect.php в строке 33 ОШИБКА БАЗЫ ДАННЫХ! Пожалуйста, свяжитесь с администратором. "

В чем может быть причина. Кто-нибудь может мне помочь?

Ответы [ 3 ]

2 голосов
/ 13 мая 2011
if($link===false)

Должно быть:

if($this->link===false)

Не так ли?

Кроме того, вы можете добиться большего успеха, чем это!Разработайте его так, чтобы соединение с БД было постоянным во всех случаях использования класса.Одно новое соединение для каждого запроса не является хорошей практикой.Хорошее начало, хотя.Как сказал Джейсон МакКрири, используйте mysqli, или PDO, или что-то из коробки.Много сторонних библиотек там тоже.Рассматривали ли вы решение для отображения данных?Это хорошее начало, хотя!

РЕДАКТИРОВАТЬ: Я собираюсь рекомендовать использовать контейнер инъекций зависимостей для правильного сохранения соединения с БД.

2 голосов
/ 13 мая 2011

Как сказал SkippyChalmers, вам нужен один экземпляр базы данных.

function db($config)
{
    static $db = NULL;
    if($db === NULL)
    {
        $db = new DBConnect($config);
    }
    return $db;
}

// db()->sql_query(...);

Однако я рекомендую переключиться на PDO .

0 голосов
/ 13 мая 2011

Советую вам Extend класс базы данных или сделать экземпляр класса БД 1 раз в конструкции.

Пример с расширением:

class Anything Extends Database {
///and here you can use DB methods as $this->sql_query...
}

Второй способ:

class Anything {

   private $db;

   public function __construct() {
      $this->db = new DBConnect();
      //then use db as $this->db->sql_query in the class with this same instance.
   }
}

Я думаю, что это правильный путь.

ИЛИ Попробуйте отредактировать ваш конструктор.Попробуйте это:

function __construct()
      {

       $this->link = mysql_connect($this->localhost,$this->user,$this->password) or die(mysql_error()."<br/>".mysql_errno());
       mysql_select_db($this->db, $this->link)or die(mysql_error()."<br/>".mysql_errno());
       mysql_query("SET NAMES ".DB_CHARSET , $this->link) or die(mysql_error()."<br/>".mysql_errno());
           if($this->link===false)
           die("Didn't connect to DB");            

       }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...