2015-05-20 86 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

它不应该是一个字符串?我应该使用哪种数据类型? –