2016-09-28 3 views
-1

Я пытаюсь создать оператор вставки через PDO с переменными, но всегда получаю следующие ошибкиPDO оператор вставки с переменными

Fatal error: Uncaught Error: Call to a member function prepare() on null in /Applications/XAMPP/xamppfiles/htdocs/Jobber/user.php:9 Stack trace: #0 /Applications/XAMPP/xamppfiles/htdocs/jobber/usercheck.php(3): Users->__construct('steve', '[email protected]', 'test', 1) #1 {main} thrown in /Applications/XAMPP/xamppfiles/htdocs/Jobber/user.php on line 9 

это код, я использую для него

class Users{ 
     private $connect ; 

     function __construct($name,$email,$password,$usertype){ 
      include("connect.php"); 
      $startDb = new Connect(); 
      $this->connect = $startDb->getDb(); 
      $sqlquery = $this->connect->prepare("INSERT INTO `user`(`Username`, `Email`, `Active`, `Password`, `usertype`) VALUES (" + $name + "," +$email +",0," + $password + "," + $usertype + ")"); 
      $sqlquery->execute(); 
     }  
    } 

Есть ли проблема с соединением или это что-то еще с переменными?

это класс подключения

class Connect{  
     private $host = "localhost:8080"; 
     private $user = "root"; 
     private $password = "test"; 
     private $dbName = "jobber"; 
     private $db; 

     function __construct(){ 
      try{ 
       $connection = new PDO('mysql:host=localhost;dbname=jobber',$this->user,$this->password); 
      }catch(PDOException $ex){ 
       echo $ex; 
      } 
     } 

     function getDb(){ 
      if($this->db instanceof PDO){ 
       return $this->db; 
      } 
     } 
    } 
+1

Показать код класса 'Connect'. –

+2

'$ startDb-> getDb()' возвращает значение null. Вы пробовали отладку? – trincot

+0

Как и сообщение об ошибке, ваш код использует что-то ($ this-> connect, поскольку это единственное место, где вы вызываете prepare()) как объект класса, который, в свою очередь, должен иметь метод под названием prepare. Но $ this-> connect фактически содержит null .. –

ответ

1

В вашем Connect классе, вы объявили private $db;, и вы возвращаетесь $this->db в методе getDb(), но вы никогда не присваивается ему значение. Кажется, вы, вероятно, хотели сделать это в конструкторе.

Вместо

$connection = new PDO('mysql:host=localhost;dbname=jobber',$this->user,$this->password); 

использования

$this->db = new PDO('mysql:host=localhost;dbname=jobber',$this->user,$this->password); 

В вашем Users классе, более правильный способ использовать подготовленное заявление было бы подготовить заявление SQL с заполнителей. Вы можете либо связать переменные в подготовленное заявление вручную с bindValue, или передать их методу execute в массиве, как это:

$sqlquery = $this->connect->prepare("INSERT INTO `user` 
     (`Username`, `Email`, `Active`, `Password`, `usertype`) VALUES (?, ?, 0, ?, ?)"); 
$sqlquery->execute([$name, $email, $password, $usertype]); 

, но, честно говоря, тот факт, что это происходит в в конструктор кажется мне довольно странным.

+0

Это действительно странно. Если я думаю о том, что я знаю, что это неправильно, но я в настоящее время играю вокруг проверки того, как все работает с PDO и PHP – stevedc

Смежные вопросы