我不太擅长解释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>';