Класс базы данных PHP MySQL не работает при вставке

#php #mysql #database #insert

#php #mysql — сервер #База данных #вставить #mysql

Вопрос:

Я использовал этот класс:

 <?
class DbConnector {

var $theQuery;
var $link;

function DbConnector() {

    $host = 'localhost';
    $db = 'my_db';
    $user = 'root';
    $pass = 'password';

    // connect to the db
    $this->link = mysql_connect($host, $user, $pass);
    mysql_select_db($db);
    register_shutdown_function(array(amp;$this, 'close'));
}

function find($query) {
    $ret = mysql_query($query, $this->link);
    if (mysql_num_rows($ret) == 0)
        return array();
    $retArray = array();

    while ($row = mysql_fetch_array($ret))
        $retArray[] = $row;

    return $retArray;
}

function insert($query) {
    $ret = mysql_query($query, $this->link);

    if (mysql_affected_rows() < 1)
        return false;
    return true;
}

function query($query) {
    $this->theQuery = $query;
    return mysql_query($query, $this->link);
}

// get some results
function fetchArray($result) {

    return mysql_fetch_array($result);
}

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

function exists($query) {
    $ret = mysql_query($query, $this->link);
    if (mysql_num_rows($ret) == 0)
        return false;
}

function last_id($query) {
    return mysql_insert_id($query);
}

}

?>
  

Который я использую для множества запросов, и он работает нормально, хотя я пытаюсь вставить, используя этот запрос:

     global $db;
        $query = $db->insert("INSERT INTO  `submissions` (
         `id` ,
        `quote` ,
        `filename` ,
        `date_added` ,
        `uploaded_ip`
        )
    VALUES (
    NULL ,  '{$quote}',  '{$filename}',  NOW(),  '{$_SERVER['REMOTE_ADDR']}')
    ");
  

И это выдает мне эту ошибку:

 Not Found

 The requested URL /horh_new/id/<br /><b>Fatal error</b>: Call to a member function        insert() on a non-object in <b>/Applications/MAMP/htdocs/horh_new/addit.php</b> on line <b>52</b><br /> was not found on this server.
  

Хотя, когда я не использую этот класс выше, а использую это вместо:

 $con = mysql_connect("localhost","root","password");
 if (!$con) {
   die('Could not connect: ' . mysql_error());
   }

 mysql_select_db("my_db", $con);

 mysql_query("INSERT INTO  `submissions` (
         `id` ,
        `quote` ,
        `filename` ,
        `date_added` ,
        `uploaded_ip`
        )
    VALUES (
    NULL ,  '{$quote}',  '{$filename}',  NOW(),  '{$_SERVER['REMOTE_ADDR']}')
    ");

 echo mysql_insert_id();

 mysql_close($con);
  

Это работает нормально. Кто-нибудь может сказать мне, что не так с моим классом? Я был бы действительно признателен.

Комментарии:

1. Ну, исходя из этой ошибки, я бы сказал, что $ db — это не то, что вы ожидаете. Удалите его, и что вы видите?

2. Ваша переменная $ db не была создана там, где вы получаете эту ошибку.

Ответ №1:

Вы должны сделать как

 global $db;
$db = new DbConnector();
  

Или лучший способ использовать это

добавьте статическую функцию класса DbConnector, которая будет создавать только один экземпляр на протяжении всего запроса

 public static function getInstance(){
   static $instance = null;
   if($instance === null){
      $instance = new DbConnector();
   }

   return $instance;    
}
  

И используйте этот класс как

 $db = DbConnector::getInstance();
$db->insert($query);
  

Комментарии:

1. итак, $db = DbConnector::getInstance(); в основном просто проверяет, был ли создан экземпляр или еще нет? Спасибо за быструю помощь!

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

Ответ №2:

вам необходимо создать экземпляр объекта перед его использованием

 $db = new DbConnetor();
  

теперь вы можете выполнить вставку

хотя я предлагаю сначала добавить метод __construct для подключения к базе данных

 class DbConnector {

  public function __construct() {
     // connect to db here

  }
  

Ответ №3:

Вы уверены, что $ db содержит экземпляр вашего класса? Может быть, просто выполните var_dump () из $ db непосредственно перед вызовом $ db-> insert() и посмотрите, установлено ли оно.