PHP PDO 执行预处理语句查询为何失败

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()方法来绑定参数。需要根据实际表和列名称进行相应的更改。

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/843360
  • 这篇博客你也可以参考下:PHP PDO 接口文档
  • 除此之外, 这篇博客: PHP对象进阶中的 PDO 预处理 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 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);

  • 以下回答由chatgpt基于相关博客总结生成:

    针对问题中的代码和执行结果,无法成功执行查询操作的原因可能有以下几点:

    1. 数据库连接错误:确认数据库连接的相关信息是否正确,包括主机名、用户名、密码等,并确认数据库是否已经正常启动。

    2. SQL语句错误:确认SQL语句是否正确,包括表名、列名等是否与实际数据库匹配。可以尝试在数据库管理工具中执行该SQL语句,查看是否有语法错误。

    3. 绑定变量错误:在代码中使用了bindParam函数绑定变量:id,确保变量名称与SQL语句中的占位符一致,并检查是否为正确的变量赋值。

    4. 异常处理错误:在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是否为真来确定查询是否成功。