使用外部 PHP 文件中的 PDO 连接 mysql 数据库

Connecting mysql database using PDO in external PHP file

我有一个 Index.php,它有一个表单,用于在提交该表单时获取用户详细信息,它会将数据触发到新的 program.php 以在 program.php 中进行验证我已链接db.php 其中我连接到数据库,db.php 的代码如下:

<?php
    $link=mysql_connect('localhost', 'root', '') or die ("mysql_connect_error()");
    $dbselect=mysql_select_db('test',$link) or die ("Error while connecting the database");
?>

因为以这种方式使用它 sql 注入是可能的,所以我尝试将其更改为下面给出的代码:

<?php
$hostname='localhost';
$username='root';
$password='';

try
{
    $dbh = new PDO("mysql:host=$hostname;dbname=test",$username,$password);

    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // <== add this line
    $dbh = null;
}
catch(PDOException $e)
{
    echo $e->getMessage();
}
?>

但是当我连接提交表单时出现错误。在我的 program.php 中,我通过 include "db.php"; 调用了 db.php。由于我是 PDO 的新手,所以我不确定我哪里出错了。

已更新 program.php 代码

<?php
if($_POST)
{
    include "link_db.php";

    if ($_POST[admin_sign_up])
    {
        $fname=$_POST[fname];
        $lname=$_POST[lname];   
        $id   =$_POST[id];
        $id_pass=$_POST[id_pass];
        $sql="insert into admin_database(fname, lname, id, id_pass) 
        value ('$fname','$lname','$id','$id_pass')";

        mysql_query($sql);

        $error=mysql_error();

        if(empty($error))
        {
            echo "<script>alert('Registration Successful...')</script>";
            header("Location:index.php",true);
        }
        else 
        {
            echo "Registration Failed...<br> Email Id already in use<br>";
            echo "<a href='failed.php'>Click to SignUp again</a>";
        }
    }

    if ($_POST[admin_login])
    {

        $id   =$_POST[id];
        $id_pass=$_POST[id_pass];

        $sql="select * from admin_database where id = '$id' and id_pass= '$id_pass'";
        $result=mysql_query($sql);
        echo mysql_error();
        $row=mysql_fetch_array($result);
        $rowcnt=mysql_num_rows($result);

        if($rowcnt==1)
        {
            session_start();
            $_SESSION['id']=$id;
            $_SESSION['fname']=$row['fname'];
            $_SESSION['lname']=$row['lname'];
            $_SESSION['varn']="Y";
            echo "Login Successfully....";
            header("Location:home.php",true);
        }
        else
        {
            $id   =$_POST[id];
            $id_pass=$_POST[id_pass];
            $sql="insert into adminfailure(id, id_pass, date_time) 
            value ('$id','$id_pass',NOW())";
            mysql_query($sql);
            $error=mysql_error();
            if(empty($error))
            {
                Echo "Invalid Login ID or Password....";
                header("Location:fail.php",true);
            }
            else
            {
                echo "incorrect details";
            }
        }
    }
    if ($_POST[logout])
    {
        header("location:destroy.php",true);
    }
}
?>

更新了我得到的错误

注意:使用未定义常量 test_sign_up - 在 B:\XAMPP\htdocs\test\program.php 第 6

行假设 'test_sign_up'

注意:未定义索引:test_sign_up in B:\XAMPP\htdocs\test\program.php on line 6

注意:使用未定义常量 test_login - 假设 'test_login' 在 B:\XAMPP\htdocs\test\program.php 第 32

注意:使用未定义的常量 id - 假定 B:\XAMPP\htdocs\test\program.php 中的 'id' 第 35

注意:使用未定义常量 id_pass - 假定第 36 行 B:\XAMPP\htdocs\test\program.php 中的 'id_pass' 没有选择数据库 警告:mysql_fetch_array() 期望参数 1 是资源,第 41

行 B:\XAMPP\htdocs\test\program.php 中给出的布尔值

警告:mysql_num_rows() 期望参数 1 为资源,第 42

行 B:\XAMPP\htdocs\test\program.php 中给出的布尔值

注意:使用未定义的常量 id - 假设在 B:\XAMPP\htdocs\test\program.php 中的 'id' 行 56

注意:使用未定义常量 id_pass - 假定第 57 行 B:\XAMPP\htdocs\test\program.php 中的 'id_pass' 不正确的细节 注意:使用未定义的常量注销 - 假设 'logout' in B:\XAMPP\htdocs\test\program.php on line 73

注意:未定义的索引:注销在 B:\XAMPP\htdocs\test\program.php on line 73

在您的代码中,您首先创建到数据库的连接,然后将其设置为空。
之后每当您尝试访问 $dbh 对象时,它将是 null.

$dbh = new PDO("mysql:host=$hostname;dbname=test",$username,$password);

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh = null;  // <= Right here.

删除 $dbh = null; 行,您应该可以按预期使用该对象。

$dbh 对象不仅仅是一个 "link" ,就像你在 mysql_* 代码中所做的那样,它是一个你用来调用数据库的对象,这不是您在 mysql_* 调用中使用的相同对象。
即,您不能使用早期的 mysql_* 代码,而只是将 pdo 对象传递给调用而不是 mysql link.
因此代码会与您之前的代码略有不同。

示例:

// Earlier code using `mysql_* API`:
$sql="select * from admin_database where id = '$id' and id_pass= '$id_pass'";
$result=mysql_query($sql);
$row=mysql_fetch_array($result);


// Would look something like this using PDO:
$statement = $dbh->prepare('SELECT * FROM admin_database WHERE id =:id AND id_pass =:idpass');
// Here you can either use the bindParam method, or pass the params right into the execute call:
$statement->execute(array('id' => $id, 'idpass' => $id_pass);
$row = $statement->fetch(); 

如果您在转换代码时遇到问题,我建议您阅读 docs 中的 PDO


进一步的建议

当您包含这样的文件时,您只想在每个脚本中包含一次 运行,确保它只包含一次总是一个好主意。这可以通过使用 include_once 关键字而不只是 include 来完成。现在,如果您使用 include,这将尽可能包含脚本,如果不能,它将保留 运行 脚本,当您尝试使用文件中设置的变量时脚本会崩溃。
在这种情况下,我不使用 include,而是建议使用 require(或者 require_once)关键字。这将包含该文件,如果不能,则停止执行脚本并显示一条错误消息(如果您有错误报告)。

您不仅要更改 db.php,还要更改代码中的所有查询。并始终使用 准备好的语句 将变量传递给查询。否则 PDO 将无法保护您免受注射。

目前我正在写 tutorial on PDO,它仍然不完整,但可以为您提供基础知识。