pdo开始使用pdo


备注

本节概述了pdo是什么,以及开发人员可能想要使用它的原因。

它还应该提到pdo中的任何大型主题,并链接到相关主题。由于pdo的文档是新的,您可能需要创建这些相关主题的初始版本。

安装或设置

PDO是PHP中的通用数据库连接命令,它支持12种不同的数据库类型,例如MySQL,MongoDB,NoSQL 。 PDO的一大优点是它计算代码以支持数据库类型,因此在转移到另一个数据库系统时不需要任何机会。


摘要

PDO 库MySQLi
数据库支持 12个不同的司机库MySQLi
API OOP OOP +程序
连接 简单简单
命名参数 没有
对象映射
准备好的声明(客户端) 没有
性能 快速快速
存储过程

使用PDO连接数据库:

连接部分看起来很尴尬,但我们需要处理。 PDO的其余部分简单而有用,它也有助于使安全部分更容易。

$connection = new PDO("mysql:host=localhost;dbname=myDatabase, username, password);
 

PDO连接按以下顺序排列:

PDOdatabase type :host = host ; dbname = database name root password );


使用PDO从数据库中安全选择:

// We use a array to hold the data about whats the :var is in normal $var
$params = array(
    ':username' => '$username', 
    ':email' => $mail, 
);

// Prepare the SQL and using named secure parameters ":username"
$pdo->prepare('SELECT * FROM users WHERE username = :username AND email = :email');

// Execute the $params and send them to the $pdo->prepare 
$pdo->execute($params);
 

您刚刚阅读的代码是受保护的代理SQL注入


教程:

安装:

如果您没有PDO,请如何安装

指南:

W3Schools教程
Tuts + Tutorial(推荐)

PDO设置属性错误模式

PDO :: setAttribute在数据库句柄上设置一个属性。 setAttribute的描述是:

public bool PDO::setAttribute ( int $attribute , mixed $value )
 

PDO :: ATTR_ERRMODE:此属性用于错误报告。它可以具有以下值之一。

  • PDO::ERRMODE_SILENT :如果代码中未设置ATTR_ERRMODE,则ERRMODE_SILENT是ATTR_ERRMODE属性的默认值。它设置错误代码。在静默模式下,如果SQL中存在错误,PDO将不会抛出异常; PDO不会发出任何警告;它只会返回false。 PDO :: ERRMODE_SILENT的值为0.脚本将运行而不会生成任何错误或警告。
  • PDO::ERRMODE_WARNING :此值引发E_WARNING。在警告模式下,如果SQL中存在错误,PDO将发出警告但脚本将继续运行。 PDO :: ERRMODE_WARNING的值为1.脚本将运行并生成有关错误的警告。
  • PDO::ERRMODE_EXCEPTION :此值抛出异常。在异常模式下,如果SQL中存在错误,PDO将抛出异常并且脚本将停止运行。 PDO :: ERRMODE_EXCEPTION的值为2.脚本将停止执行生成引发异常的错误。

示例:现在我们将通过一些示例来查看属性ATTR_ERRMODE的各种值。为此,请创建一个名为learn_project_db 的数据库,并在其中插入一个名为user_table 的表。以下SQL代码段可用于实现:

DROP DATABASE IF EXISTS `learn_project_db`;
CREATE DATABASE `learn_project_db`;
USE `learn_project_db`;
CREATE TABLE `user_table` (
  `user_email` varchar(50) PRIMARY KEY,
  `user_password` varchar(50) NOT NULL
);
INSERT INTO `user_table` (`user_email`, `user_password`) VALUES
('test1@example.com', '123'),
('test2@example.com', '1234'),
('test3@example.com', '12345');
 

首先,我们将检查如果我们不设置ATTR_ERRMODE 会发生什么,我们将在SQL查询中出错。创建一个名为default.php 的PHP文件并尝试以下操作:

<?php
    $server = "localhost";
    $db_username = "root";
    $db_password = "";
    $db_name = "learn_project_db";
    $conn = new PDO("mysql:host=$server;dbname=$db_name",$db_username,$db_password);
    $sql_query = "SELECT * FROM wrong_user_table";
    $stmt = $conn->prepare($sql_query);
    $stmt->execute();
    $result_set = $stmt->fetchAll();
    var_dump($result_set);
    /*Get the current error mode of PDO*/
    $current_error_mode = $conn->getAttribute(PDO::ATTR_ERRMODE);
    echo "<br>";
    echo "Value of PDO::ATTR_ERRMODE: ".$current_error_mode; 
?>
 

请注意,查询中的表名是wrong_user_table ,该名称未在我们之前创建的数据库中定义。但是,由于我们没有设置ATTR_ERRMODE ,它将运行脚本而不会抛出任何异常或发出任何警告。它将输出一个空数组作为结果集。我们还应该注意到, PDO::ATTR_ERRMODE 的值是0。

现在,我们将检查如果我们使用值PDO::ERRMODE_WARNING 设置ATTR_ERRMODE 将会发生什么,并且我们将在SQL查询中出错。创建一个名为warning.php 的PHP文件并尝试以下操作:

<?php
    $server = "localhost";
    $db_username = "root";
    $db_password = "";
    $db_name = "learn_project_db";
    $conn = new PDO("mysql:host=$server;dbname=$db_name",$db_username,$db_password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);    
    $sql_query = "SELECT * FROM wrong_user_table";
    $stmt = $conn->prepare($sql_query);
    $stmt->execute();
    $result_set = $stmt->fetchAll();
    var_dump($result_set);
    /*Get the current error mode of PDO*/
    $current_error_mode = $conn->getAttribute(PDO::ATTR_ERRMODE);
    echo "<br>";
    echo "Value of PDO::ATTR_ERRMODE: ".$current_error_mode; 
?>
 

warning.php 输出是:

Warning: PDOStatement::execute(): SQLSTATE[42S02]: Base table or view not found: 1146 Table 'learn_project_db.wrong_user_table' doesn't exist in E:\xampp\htdocs\oop\db.php on line 10
array(0) { } 
Value of PDO::ATTR_ERRMODE: 1
 

这次,当我们将ATTR_ERRMODE 设置为PDO::ERRMODE_WARNING ,它将显示一条警告消息。该脚本成功运行并显示一个空数组作为输出,其值为PDO::ATTR_ERRMODE 为1。

最后,我们将检查如果我们使用值PDO::ERRMODE_EXCEPTION 设置ATTR_ERRMODE 会发生什么,并且我们将在SQL查询中出错。创建一个名为error.php 的PHP文件并尝试:

<?php
    $server = "localhost";
    $db_username = "root";
    $db_password = "";
    $db_name = "learn_project_db";
    $conn = new PDO("mysql:host=$server;dbname=$db_name",$db_username,$db_password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);    
    $sql_query = "SELECT * FROM wrong_user_table";
    $stmt = $conn->prepare($sql_query);
    $stmt->execute();
    $result_set = $stmt->fetchAll();
    var_dump($result_set);
    /*Get the current error mode of PDO*/
    $current_error_mode = $conn->getAttribute(PDO::ATTR_ERRMODE);
    echo "<br>";
    echo "Value of PDO::ATTR_ERRMODE: ".$current_error_mode; 
?>
 

error.php 输出是:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'learn_project_db.wrong_user_table' doesn't exist' in E:\xampp\htdocs\oop\db.php:10 Stack trace: #0 E:\xampp\htdocs\oop\db.php(10): PDOStatement->execute() #1 {main} thrown in E:\xampp\htdocs\oop\db.php on line 10
 

这次,当我们使用PDO::ERRMODE_EXCEPTION 值设置ATTR_ERRMODE 时,它将抛出PDOException ,这会产生致命错误。抛出异常后,脚本将停止执行。这是处理数据库查询相关错误的最常用方法。在大多数情况下,我们使用此值设置属性ATTR_ERRMODE 以处理可能驻留在SQL查询中的任何异常。