0

所以,简单地说,我觉得这段代码应该可以工作。从字面上看,此时我只是想创建一个 PHP 类,它接收一些信息并对数据库运行命令。我知道该命令有效,所以不是那样,它与我的变量范围有关。

我是 PHP 新手,处理起来很有趣。

<?php
require __DIR__ . '/../bin/composer/vendor/autoload.php';

$cx = new Customer();
$cx->WriteCxToDB();

class Customer {
  public $database = new medoo([
    'database_type'=>'mysql',
    'database_name'=>'dbname',
    'server'=>'localhost',
    'username'=>'dbusername',
    'password'=>'dbpassword',
    'charset'=>'utf8'
  ]);

  public function WriteCxToDB(){
    global $database;
    if($database->has("customer", [
      "OR"=>[
        "username"=>"cxusername",
        "email"=>"email@gmail.com"
      ]
      ]))
      {
      echo "User already exists";
    }else{
      $database->insert("customer", [
        "username"=>"username",
        "keyword"=>"keyword",
        "email"=>"email@gmail.com",
        "phone"=>"444-444-4444",
        "first_name"=>"First",
        "last_name"=>"Last"
    ]);
    echo "User added";
  }
  echo "Done";
  }
}
?>

我正在使用 composer 和 medoo 来做这个数据库条目。我知道数据库代码有效,因为我自己运行它并且运行良好。

我正在努力解决的似乎是$database代码中的变量。如果我从混合中删除该变量,则函数调用有效。我觉得我只是不明白我应该在哪里声明变量/如何从函数内部/外部引用它。谢谢。

4

2 回答 2

2

这里的问题是使用全局范围。代替:

 global $database;
    if($database->has("customer",

利用

 if($this->database->has("customer",

您还可以考虑在构造函数中实例化 $database ,即

private $database;

public function __construct() { 
  $this->database = new medoo([args....
于 2016-12-12T16:38:47.813 回答
2

正如前面示例中所建议的那样,您应该使用类似的东西并将数据库连接传递给类,扩展基类将允许重用数据库连接:

private $database;  

public function __construct($db_connection = null){
    //do stuff or set db
    $this->database = $this->db_connect;
}

或者在类中创建一个方法来做到这一点

 private function db_connect(){
        return new medoo([
        // required
        'database_type' => 'mysql',
        'database_name' => 'name',
        'server' => 'localhost',
        'username' => 'your_username',
        'password' => 'your_password',
        'charset' => 'utf8',    
        ]);

    }

检查考虑捕获错误。在数据库上使用唯一键或主键将是一种更安全的方法,否则您必须在数据库上进行验证和搜索。添加密钥并检查重复错误。

if($database->error()){
  //deal with return or pass to logging
}
于 2016-12-12T17:17:52.367 回答