【问题标题】:Insert into database in OOP doesn't work在 OOP 中插入数据库不起作用
【发布时间】:2015-07-31 11:13:35
【问题描述】:

我正在尝试按照教程进行面向对象的登录并插入数据库,但这不起作用。它不会连接到数据库,错误:未选择数据库。你能帮帮我吗?

这是代码:

index.php 中的表单

   <form action="insert.php" method="post">
   Firstname: <input type="text" name="fname" /><br><br>
   Lastname: <input type="text" name="lname" /><br><br>
   <input type="submit" />

insert_class.php 中的类:

<?php 
class Insert_class {

public $servername;
public $username;
public $password;
public $dbname;

public function __construct(){

 // Create connection
  $conn = mysqli_connect($servername, $username, $password, $dbname);
 // Check connection
 if (!$conn) {
   die("Connection failed: " . mysqli_connect_error());
 }

 // insert into database
 $sql = "INSERT INTO nametable (firstname, lastname)
 VALUES ('$_POST[fname]','$_POST[lname]')";

 if (mysqli_query($conn, $sql)) {
   echo "New record created successfully";
 } else {
   echo "Error: " . $sql . "<br>" . mysqli_error($conn);
 }

  mysqli_close($conn);

  }
}

insert.php 中用于登录和插入数据库的对象:

require 'insert_class.php';

$insert = new Insert_class();

$insert->servername ='localhost';
$insert->username ='root';
$insert->password ='';
$insert->dbname ='newdatabase';

【问题讨论】:

  • 请学习如何访问一个类属性,这是 PHP 101。而且你应该得到很多错误,所以打开错误报告
  • 我研究了 3 天。如果在 insert_class.php 中添加变量,则插入数据库效果很好。问题是为什么对象中的变量不适用?
  • 正如我所说,您需要学习基础知识:php.net/manual/en/language.oop5.basic.php
  • 您正在_construct() 函数中连接到数据库。该方法会在您执行$insert = new Insert_class(); 后立即运行但此时您尚未设置构造函数所需的对象属性。
  • 是的,有未定义变量的通知。我知道。这不是访问类属性的正确方法吗?$insert->servername ='localhost';

标签: php database oop object insert


【解决方案1】:

试试这个

<?php 
class Insert_class {

    private $servername;
    private $username;
    private $password;
    private $dbname;
    private $con

    public function __construct($servername,$username,$password,$dbname)
    {

        $this->servername = $servername;
        $this->username   = $username;
        $this->password   = $password;
        $this->dbname     = $dbname;
        // Create connection
        $this->conn = mysqli_connect($this->servername, $this->username,
                                     $this->password, $this->dbname);

        if ($this->con->connect_error) {
            die('Connect Error (' . $this->con->connect_errno . ') '. $this->con->connect_error);
        }

        // etc

    }

那你就可以了

require 'insert_class.php';
$insert = new Insert_class('localhost','root','','newdatabase');

请注意,我还将 $con 捕获为属性。您的代码将包含很多它,因为它只会在 __construct 中可见,但您可能不想在此类中编写任何其他方法。

另请注意,我更改了成功连接的测试。这是检查连接是否成功的正确方法。一个简单的if( ! $con ) 不够好。

【讨论】:

  • 我实际上打算这样做,这是我的第一个解决方案。但后来我认为 OP 想要简单一点。我的解决方案也很有效,伙计;)+1。
  • 这会给出“已连接”消息,如上例所示。我的东西都适用于连接,但现在我需要管理插入部分代码。
  • 您的代码中的连接测试不正确,请参阅答案中的更改
  • @Akshay 我能想到的是,在您的系统上,您必须在您的 PHP.INI 文件 mysqli.default_pwmysqli.default_usermysqli.default_host = 中设置这些参数,这将解释为什么该代码在您的系统上工作。但这不是一个测试数据库连接代码的好系统,原因很明显
【解决方案2】:

您可以使用 DEFINE ..

,而不是显式定义连接详细信息
  define("DB_HOST", "localhost");
  define("DB_USER", "root");
  define("DB_PASSWORD", "");
  define("DB_NAME", "newdatabase");

insert_class.php ...

public function __construct(){

  $conn  = mysql_connect(DB_HOST,DB_USER,DB_PASSWORD) or die(mysql_error());
  mysql_select_db(DB_NAME, $conn) or die(mysql_error());

}

【讨论】:

  • 这将使得不可能为不同的数据库重复使用相同的类,使其更像是“面向类的编程”而不是“面向对象的编程”。
猜你喜欢
  • 2017-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多