За последние 24 часа нас посетили 60870 программистов и 1744 робота. Сейчас ищут 2163 программиста ...

ошибка Call to a member function prepare() on a non-object

Тема в разделе "PHP для новичков", создана пользователем shpok, 4 ноя 2012.

  1. shpok

    shpok Активный пользователь

    С нами с:
    20 июн 2012
    Сообщения:
    23
    Симпатии:
    0
    Добрый день всем участника форума, я только начинаю изучать php, в качестве практики пытаюсь написать код для простенького блога . Вначале написал простой класс для подключения к БД
    Код (Text):
    1. $host='localhost';
    2. $user='root';
    3. $pass='';
    4. $db='users';
    5.  
    6.  class ConectDB {
    7.  
    8.     public $host;
    9.     public $user;
    10.     public $pass;
    11.     public $db;
    12.    
    13.     function __construct(){
    14.              
    15.            
    16.   }
    17.  
    18.     function Conect($host,$user,$pass,$db){
    19.     global $DBH;
    20.     try{
    21.        
    22.  
    23.   $DBH=new PDO("mysql:host=$host;dbname=$db", $user, $pass);
    24.   $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    25.   $DBH->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND,'SET NAMES utf8');
    26.    $DBH->query("CREATE TABLE IF NOT EXISTS`users` (
    27.    `id` INT AUTO_INCREMENT PRIMARY KEY,
    28.    `name` VARCHAR(255) NOT NULL,
    29.    `login` VARCHAR(50) NOT NULL,
    30.    `pass` VARCHAR(100) NOT NULL,
    31.    `email` VARCHAR(255),
    32.    `date` TIMESTAMP DEFAULT '0000-00-00 00:00:00',
    33.    `update` TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    34.    `text` TEXT NOT NULL
    35.    )ENGINE=MyISAM DEFAULT CHARSET=utf8");
    36.  
    37.        }
    38.   catch(PDOException $e){
    39.    
    40.    
    41.        
    42.   echo'Ошибка подключения '.$e->getMessage();
    43.     }
    44.   }
    45.  
    46.  
    47.  
    48.  
    49.  function InsertComment($comments){
    50.  
    51.     global $DBH;
    52.  
    53.         try{
    54.    
    55.  
    56.     $result=$DBH->prepare("INSERT IGNORE INTO `users` (`text`) VALUES (:comments)");
    57.     $result->bindParam(':comments',$comments);
    58.     $result->execute($data);
    59.     }
    60.     catch (PDOException $e)
    61.     {
    62.      echo'Ошибка вставки комментария'.$e->getMessage();    
    63.     }
    64.   }
    65.  
    66.    
    67.     function Check($login,$pass){
    68.     global $DBH;
    69.    
    70.     try{
    71.    
    72.      $result=$DBH->prepare("SELECT FROM `users` WHERE `login`=:login AND `pass`=:pass");
    73.      $data=array('pass' => '$pass', 'login' => '$login');
    74.      $result->execute($data);
    75.    
    76.     }
    77.    catch (PDOException $e){
    78.    
    79.   echo'Невозможно проверить данные пользователя!'.$e->getMessage();
    80.     }
    81.          
    82.  
    83.    
    84.    }
    85.    
    86.        
    87. }
    88.  
    89.  
    для вызова методов данного класса использую следующий код
    Код (Text):
    1. if (isset($_POST['text'])){
    2.  
    3.     if(isset($_POST['comments']) && !empty($_POST['comments']))
    4.     {
    5.     $comments=$_POST['comments'];  
    6.     $a = new ConectDB($host,$user,$pass,$db);
    7.     $a->Conect($host,$user,$pass,$db);
    8.     $a->InsertComment($comments);
    9.     }
    10.     Header("Location:{$_SERVER['SCRIPT_NAME']}?".time());
    11.    
    12.  }
    13. if(isset($_POST['check'])){
    14.     if(isset($_POST['login']) && !empty($_POST['login']))  
    15.      {
    16.       $login=$_POST['login'];
    17.      }
    18.      else echo'Вы не ввели логин!';
    19.    
    20.      if(isset($_POST['pass']) && !empty($_POST['pass']))
    21.      {
    22.      $pass=$_POST['pass'];
    23.      }
    24.      else echo'Вы не ввели пароль!';
    25.    
    26.     $a = new ConectDB($host,$user,$pass,$db);
    27.     $a->Conect($host,$user,$pass,$db);
    28.     $a->Check($login,$pass);
    29.   }
    При вызове метода InsertComment все работает нормально-запись в БД добавляется,
    а вот при вызове метода Check-выдается сразу 2-е ошибки SQLSTATE[28000] [1045] Access denied for user 'root'@'localhost' (using password: YES)
    Fatal error: Call to a member function prepare() on a non-object
    В чем может быть проблема или где искать ошибки?
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Re: ошибка Call to a member function prepare() on a non-obje

    логин/пароль неправильные
     
  3. shpok

    shpok Активный пользователь

    С нами с:
    20 июн 2012
    Сообщения:
    23
    Симпатии:
    0
    Re: ошибка Call to a member function prepare() on a non-obje

    Логин и пароль правильные-в таблице такие есть.
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Re: ошибка Call to a member function prepare() on a non-obje

    В какой таблице?
     
  5. shpok

    shpok Активный пользователь

    С нами с:
    20 июн 2012
    Сообщения:
    23
    Симпатии:
    0
    Re: ошибка Call to a member function prepare() on a non-obje

    Вы имеете ввиду логин/пароль которые вводит пользователь?Я о них говорю, если речь идет о тех,которые передаются при подключении к БД, то
    с теми же параметрами подключения-вызов метода "InsertComment" проходит нормально, комментарий вставляется, а при тех же параметрах вызов метода Check вызывает ошибку.
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Re: ошибка Call to a member function prepare() on a non-obje

    [1045] Access denied for user 'root'@'localhost'
    это логин/пароль
     
  7. shpok

    shpok Активный пользователь

    С нами с:
    20 июн 2012
    Сообщения:
    23
    Симпатии:
    0
    Re: ошибка Call to a member function prepare() on a non-obje

    Да в том-то и дело,что при одинаковых параметрах($user='root';$pass='';) подключения к БД(используя PDO) один метод работает, а второй вызывает ошибку((((. Я так понимаю,если бы логин/пароль были бы не верны, то не выполнялся бы ни один метод?
     
  8. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Ну, для начала, присмотрись повнимательней вот к этим строчкам:
    Код (PHP):
    1.     if(isset($_POST['pass']) && !empty($_POST['pass'])) {
    2.         $pass = $_POST['pass'];
    3.     } else
    4.         echo 'Вы не ввели пароль!';
    5.     $a = new ConectDB($host,$user,$pass,$db);
    6.     $a->Conect($host,$user,$pass,$db); 
    и проследи, с каким именно паролем будет совершена попытка подключиться к б.д. Поверь, это будет вовсе не то, что прописано у тебя сверху в твоём классе для работы с б.д.
     
  9. shpok

    shpok Активный пользователь

    С нами с:
    20 июн 2012
    Сообщения:
    23
    Симпатии:
    0
    Re: ошибка Call to a member function prepare() on a non-obje

    sobachnik- огромное спасибо за подсказку!