【问题标题】:How to write prepare and execute statements in OOP PDO? [closed]如何在 OOP PDO 中编写准备和执行语句? [关闭]
【发布时间】:2017-07-21 22:06:03
【问题描述】:

我有一个小问题。我是 OOP 的新手,所以这个问题听起来很愚蠢,但我找不到任何有用的信息。

我正在尝试登录数据库并将用户输入的值放入其中,我想问你,我应该在哪里编写 PDO 准备和执行语句?我知道它们是必需的,但我不知道如何正确地编写它...除此之外,我还收到错误“无法在第 24 行将类 PDO 的对象转换为字符串”。感谢您的帮助,这是我的代码:

<?php
class Connection {
public $connection;
public $dbHost = 'localhost';
public $dbName = 'employees';
public $charset = 'charset=utf8';
public $dbUser = 'root';
public $dbPassword = '';

public function __construct() {
    try {
        $this->connection = new PDO ("mysql:host=$this->dbHost;$this->dbName;$this->dbUser;
        $this->dbPassword");
        $this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    }
    catch (PDOException $e) {
        echo "There is something wrong with the database".$e->getMessage();
    }
}
function insertUserValues($tableName, $data) {
    $query = "INSERT INTO ".$tableName."(";
    $query .= implode (",",array_keys($data)).') VALUES (';
    $query .= "'" . implode ("','",array_values($data))."')";
}
}
$users = new Connection();
?>

【问题讨论】:

  • 第 24 行是哪一行?
  • $query .= "'" 。内爆 ("','",array_values($data))."')";
  • 而您的问题是“如何使用 PDO 准备好的语句创建通用插入函数”
  • 无需将数据库凭据保存在公共变量中。将它们设为私有。

标签: php mysql oop pdo


【解决方案1】:

我不太擅长解释bru,但我只是看到很长一段时间后没有答案。我为您创建了一个使用 PDO 插入值的基本类,希望它能为您指明正确的方向,我也会为您分享一些有用的链接。

首先连接。

我可以看到你已经在课堂上完成了连接,但下面是正确的最佳 pdo 连接。

    $host = '127.0.0.1';
    $db   = 'YourDatabase';
    $user = 'YourDBUser';
    $pass = 'YourDBPass';
    $charset = 'utf8';

    $dsn = "mysql:host=$host;dbname=$db;charset=$charset";
    $opt = [
            PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
            PDO::ATTR_EMULATE_PREPARES   => false,
            ];

$dbh = new PDO($dsn, $user, $pass, $opt);

这就是您设置正确 PDO 连接的方式。 dns 代表数据源名称 参考上面https://phpdelusions.net/pdo#dsn这家伙解释得比较好。你需要知道的一切。

现在您如何将这种联系与您的班级联系在一起?

我将创建一个文件收集 pdoClass.php 并从该类开始工作。

<?php
class Connection
{
    private $host = "127.0.0.1";
    private $dbName = "YourDB";
    private $user = "YourUser";
    private $pass = "YourPass";
    private $charset = 'utf8';

    private $dbh;
    private $error;
    private $stmt;

    //connection
    public function __construct()
    {
        $dsn     = "mysql:host=" . $this->host . ";dbname=" . $this->dbName . ";charset=" . $this->charset;
        $options = array(
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
            PDO::ATTR_EMULATE_PREPARES => false
        );

        try {
            // setup connection
            $this->dbh = new PDO($dsn, $this->user, $this->pass, $options);
        }
        //catch any errors
        catch (PDOException $e) {
            $this->error = $e->getMessage();
        }

    }

    //prepare statement
    public function insertUserValues($query)
    {
        $this->stmt = $this->dbh->prepare($query);
    }

    //bind values
    public function bind($param, $value, $type = null)
    {
        if (is_null($type)) {
            switch (true) {
                case is_int($value):
                    $type = PDO::PARAM_INT;
                    break;
                case is_bool($value):
                    $type = PDO::PARAM_BOOL;
                    break;
                case is_null($value):
                    $type = PDO::PARAM_NULL;
                    break;
                default:
                    $type = PDO::PARAM_STR;
            }
        }
        //actual value binding
        $this->stmt->bindValue($param, $value, $type);
    }
    //execute statement
    public function run()
    {
        return $this->stmt->execute();
    }
}

?>

基本上这就是设置数据库和插入数据库的功能所需的全部内容,我已尝试对某些部分进行评论。

现在使用这个类创建 index.php 或任何你喜欢的。然后包含类

<?php
    include'pdoClass.php';


    $users = new Connection();

    $users->insertUserValues('INSERT INTO test (name, age, description) VALUES(?,?,?)');
    $users->bind(1, 'User'); //bind each value
    $users->bind(2, 391); // bind
    $users->bind(3, 'This is a value');
    if($database->run()){

        echo "record inserted";
    }

?>

完成,如果您有任何问题或希望我解释任何事情,请随时在下面发表评论,我会尽力帮助您。

编辑:如果需要获取结果,也可以在类中新建一个函数,

单行:

public function SingleRow(){
      $this->run();
      return $this->stmt->fetch();
  }

看到我们使用fetch(); 只获取一行。大多数人在获取结果时会像这样fetch(PDO::FETCH_ASSOC) 获取它们,但是因为我们进行了正确的连接并在连接中定义了我们的默认获取模式,所以我们不需要所有我们可以使用的东西fetch();

要在 index.php 文件中显示这些结果,您将这样做:

$users->insertUserValues("SELECT name, age, description FROM test WHERE name = :name");
$users->bind(':name','joe');
$row = $users->SingleRow();

echo '<pre>';
print_r($row);
echo '</pre>';

这会将 joe 的结果显示为一个数组。

从我们的数据库中获取所有结果

我们执行另一个函数来显示所有结果。

 public function All(){
          $this->run();
          return $this->stmt->fetchall();
      }

现在我们使用 fetchall() 您会看到不同之处,因为我们想要所有结果。

 $users->insertUserValues("SELECT *  FROM test");
    $row = $users->All();

    echo '<pre>';
    print_r($row);
    echo '</pre>';

【讨论】:

  • 非常感谢您抽出宝贵的时间,伙计,这对我帮助很大!!!
  • 好人,我已经编辑了有关如何获取您刚刚插入的数据的答案,请继续阅读此博客:phpdelusions.net/pdo
猜你喜欢
  • 1970-01-01
  • 2020-04-14
  • 2012-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-11
  • 1970-01-01
  • 2012-01-12
相关资源
最近更新 更多