2015-05-20 120 views
1

我一直在努力尋找如何遵循以下過程中的OOP。PHP OOP無法查詢mysqli

這是我的連接類,它處理我與數據庫的連接。

<?php 
class Connection{ 
    public $con = null; 
    public function __construct(){ 
     return $this->con = new mysqli("127.0.0.1:3306", "root", "root", "tester"); 
    } 

} 
?> 

這裏是我的助手類,這個類包含所有將在我的webapp像插入數據的使用,刪除和更新的常用方法。

<?php 
class Helpers{ 
    public $con = null; 
    public function __construct($connection){ 
     $this->con = $connection; 
    } 

    public function register($name){ 
     $con = $this->con; 
     $sql = "insert into name(Name)value($name);"; 
     $con->query($sql); 
    } 
} 
?> 

現在,我打電話給他們這樣在我的register.php

<?php 
require "Connection.php"; 
require "Helpers.php"; 

$connection = new Connection(); 
$Helpers = new Helpers($connection); 

$Helpers->register("Keannu"); 
?> 

但我收到以下錯誤:

Call to undefined method Connection::query().

我做了什麼錯?

+2

既然你包裝它兩次,你將不得不使用'$ this-> con> con> query()'然後。避免額外的包裝。並研究PDO而不是mysqli。最後這樣做不會太費力(特別是對於更簡單的參數綁定)。 – mario

+0

你正在做一個雙重包裝,所以它將成爲'con> con'。你應該重新考慮你的結構。 Imo –

+0

@mario 好吧,現在錯誤消失了,但沒有添加到我的數據庫中。 –

回答

4

除了已經給出的答案,值中的字符串需要用引號括起來。

I.e .: value ('$name');";value ('".$name."');";這是另一種方法。

旁註:valuevalues被接受,在MySQL中都被認爲是有效的語法。

按手冊:http://dev.mysql.com/doc/refman/5.6/en/insert.html

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] 
    [INTO] tbl_name 
    [PARTITION (partition_name,...)] 
    [(col_name,...)] 
    {VALUES | VALUE} ({expr | DEFAULT},...),(...),... 

旁註:你現在的代碼是開放的SQL injection。使用mysqli with prepared statementsPDO with prepared statements,他們更安全

-1

更改您的班級,如下所示。由於您傳遞的是連接對象,因此需要將其con屬性設置爲$this->con

<?php 
class Helpers{ 
    public $con = null; 
    public function __construct($connection){ 
     $this->con = $connection->con; 
    } 

    public function register($name){ 
     $con = $this->con; 
     $sql = "insert into name (Name) values ($name);"; 
     $con->query($sql); 
    } 
} 
+0

在插入'value($ name)'過程中,這仍然會導致語法錯誤' –

+0

查看'$ Helpers-> register(「Keannu」);'<=這是一個「字符串「^ –

+0

它不應該是一個字符串?我應該使用哪種數據類型? –