【问题标题】:PHP OOP Cannot Query mysqliPHP OOP 无法查询 mysqli
【发布时间】:2015-08-01 02:29:24
【问题描述】:

几天来我一直在努力弄清楚如何在以下过程中遵循 OOP。

这是我的连接类,它处理我与数据库的连接。

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

}
?>

这是我的 Helpers 类,该类包含将在我的 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");
?>

但我收到以下错误:

调用未定义的方法 Connection::query()。

我做错了什么?

【问题讨论】:

  • 因为你要包装它两次,所以你必须使用$this-&gt;con-&gt;con-&gt;query()。避免额外的包装。并调查 PDO 而不是 mysqli。最终这将是更少的努力(特别是对于更简单的参数绑定)。
  • 你正在做一个双重包装,所以它将是con-&gt;con。你应该重新考虑你的结构。伊莫
  • @mario 好的,现在错误消失了,但它没有添加到我的数据库中。
  • 检查错误。值中的语法错误很明显;这是一个字符串。检查错误是编码/调试的一部分,你没有这样做
  • 打印 mysqli_errors 以了解数据库返回的内容

标签: php oop mysqli


【解决方案1】:

除了已经给出的答案之外,值中的字符串需要用引号括起来。

即: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它们更安全

【讨论】:

    【解决方案2】:

    如下更改您的班级。由于您传递的是连接对象,因此您需要将其 con 属性设置为 $this-&gt;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);
        }
    }
    

    【讨论】:

    • 这仍然会导致插入过程中出现语法错误value($name)
    • $Helpers-&gt;register("Keannu");
    • 不应该是字符串吗?我应该使用什么数据类型?
    • @Fred-ii- 也许你应该提供你的帮助作为答案,并且 OP 应该接受:)
    • @Fred-ii- 是的,弗雷德我现在要重新编码,我知道这个概念了。双重换行和字符串文字。非常感谢你们,让我免于挣扎。
    猜你喜欢
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多