connect.php:
<?php
$dbms='mysql'; //数据库类型
$host='localhost'; //数据库主机名
$dbName='***********'; //使用的数据库
$user='**************************'; //数据库连接用户名
$pass='*************'; //对应的密码
$dsn="$dbms:host=$host;dbname=$dbName";
try {
$dbh = new PDO($dsn, $user, $pass); //初始化一个PDO对象
}catch (PDOException $e){
die ("Error!: " . $e->getMessage() . "<br/>");
}
?>
function.php
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</html>
<?php
include('connect.php');
?>
<?php
function get_admin_username(){
global $db;
$stmt = $db->prepare("SELECT * FROM users WHERE isadmin = 1");
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo $result['username'];
}
get_admin_username()
?>
执行结果:
Uncaught Error: Call to a member function prepare() on null in *************: Stack trace: #0 *******************(11): get_admin_username() #1 {main} thrown
没有执行任何查询语句,所以无法判断是否查询失败。
示例:
要执行查询语句,需要使用$dbh对象调用prepare()方法创建一个预处理语句,并使用execute()方法执行该语句
<?php
$dbms = 'mysql'; //数据库类型
$host = 'localhost'; //数据库主机名
$dbName = '***********'; //使用的数据库
$user = '**************************'; //数据库连接用户名
$pass = '*************'; //对应的密码
$dsn = "$dbms:host=$host;dbname=$dbName";
try {
$dbh = new PDO($dsn, $user, $pass); //初始化一个PDO对象
} catch (PDOException $e) {
die("Error!: " . $e->getMessage() . "<br/>");
}
// 准备预处理语句
$stmt = $dbh->prepare("SELECT * FROM your_table WHERE column_name = :value");
// 绑定参数
$value = "your_value";
$stmt->bindParam(':value', $value);
// 执行查询
$stmt->execute();
// 获取结果
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
// 打印结果
print_r($result);
?>
示例使用了占位符column_name = :value和bindParam()方法来绑定参数。需要根据实际表和列名称进行相应的更改。
PDO 预处理:是 PDO 封装一套特定的方法,在方法中做了一些优化
PDO::prepare()
发送预处理指令,只需要提供要执行的指令即可,不需要 prepare 名字 from,成功则得到一个 PDOStatement() 类对象,失败得到一个 false (或者异常错误)
PDOStatement::bindParam()
绑定预处理所需要的参数,只能绑定变量(引用传递)
PDOStatement::bindValue()
绑定预处理所需要的参数,可以绑定值(值传递)
PDOStatement::execute()
执行预处理,成功返回 true ,失败返回 false
PDO 预处理本身实现了 MySQL 的预处理
优化了占位符:使用 :名字 代替 ?作为占位符(查看更加直观,内部还是 ?)
使用预处理,数据以变量进行拼接,防止 SQL 注入,更加安全
<?php
function pdo_init()
{
$dsn = 'mysql:host=localhost;port=3306;dbname=test;charset=utf8;';
$user = 'root';
$pass = 'root';
$pdo = new PDO($dsn, $user, $pass);
return $pdo;
}
$pdo=pdo_init();
$pre_sql='select * from admin where uid=?';
$pre_sql='select * from admin where uid=:id';
// 发送预处理指令
$stmt=$pdo->prepare($pre_sql);
$id=4;
$stmt->bindValue(':id',1);
// 直接绑定数据
$stmt->bindValue(':id',$id);
# 绑定变量数据
$stmt->bindParam(':id',$id);
// 必须传递变量
$res = $stmt->execute();
# 如果结果为 true 说明执行了预处理,但是结果无法取出
# 需要使用 fetch 查处结果
$data=$stmt->fetchall(PDO::FETCH_ASSOC);
var_dump($data);
# 输出
D:\phpstudy_pro\WWW\demo\mian.php:34:
array (size=1)
0 =>
array (size=3)
'uid' => string '4' (length=1)
'name' => string 'user1' (length=5)
'pass' => string '1233333' (length=7)
pdo 预处理绑定
结果
data=data=data=stmt->fetchall(PDO::FETCH_ASSOC);
var_dump($data);
针对问题中的代码和执行结果,无法成功执行查询操作的原因可能有以下几点:
数据库连接错误:确认数据库连接的相关信息是否正确,包括主机名、用户名、密码等,并确认数据库是否已经正常启动。
SQL语句错误:确认SQL语句是否正确,包括表名、列名等是否与实际数据库匹配。可以尝试在数据库管理工具中执行该SQL语句,查看是否有语法错误。
绑定变量错误:在代码中使用了bindParam函数绑定变量:id,确保变量名称与SQL语句中的占位符一致,并检查是否为正确的变量赋值。
异常处理错误:在catch块中打印了PDOException的getMessage()方法,这个方法可以打印出详细的错误信息,确认是否有异常抛出。
下面是可能的解决方案:
<?php
include ('pdo.php');
try {
$sql = "select * from cash where id=:id";
// 准备函数
$stmt = $conn->prepare($sql);
// 绑定变量
$stmt->bindParam(':id', $id);
// 变量赋值
$id = 1;
// 执行查询
$result = $stmt->execute();
if($result){
// fetch()提取一条数据fetchall()提取多条数据,提取数据用res变量接收
// 这里的'PDO::FETCH_ASSOC'代表结果设为关联数组返回
$res = $stmt->fetch(PDO::FETCH_ASSOC);
var_dump($res);
// 返回查询结果为几条数据
// var_dump($stmt->rowCount());
}else{
echo "查询失败";
}
}catch (PDOException $e){
echo $e->getMessage();
}
?>
通过将查询结果赋值给$result变量,并判断$result是否为真来确定查询是否成功。