使用PDO语句而不是mysql_query

时间:2014-04-21 06:48:45

标签: php mysql sql pdo

我正在学习PDO语句,以便更好地保护数据库。我在某地读到mysql_ *函数将完全弃用。因此,为了避免Web应用程序出现任何形式的错误,我将转向PDO语句。

我想在PDO语句中编写已编写的mysql_ *语句。

  1. 我已将与DB的连接写为

    try {
    
    $dbh = new PDO("mysql:host=$hostname;dbname=mysql", $username, $password);
    
    echo 'Connected to database';
    }
    catch(PDOException $e)
     {
     echo $e->getMessage();
     }
    

    Que1:现在,我不能将此文件作为连接到DB的公共文件,并将其包含在我想要的任何页面中。

    Que2:如果我可以将它用作公共文件,那么是否需要在“try”块中包含mysql语句。

  2. 我的方法是将它用作公共文件,并在我想要的任何页面上使用mysql PDO语句。

2 个答案:

答案 0 :(得分:0)

是的,您可以将其包含为其他脚本使用的常见include文件。但是,让包含文件打印任何东西可能不是一个好主意,因为它们可能被对其打印内容有特殊要求的脚本使用。例如,如果它由返回JSON的AJAX脚本使用,则打印错误消息将导致无效的JSON。

折衷方案是将代码放入函数中,并且可以使用一个参数来指定是否应该打印错误消息。

答案 1 :(得分:0)

对于这种情况,我写了PDO wrapper

您只需编辑配置常量并将此文件包含在某个引导程序文件中。 这就是全部。立即它会让你像过去那样简单地使用PDO(只要你有这个文件),但具有完整的功能和准备语句的安全性。或者甚至比旧的mysql ext更简单,因为大多数操作都将用一两行编写。

与旧的mysql ext有两个主要区别:

  • 而不是致电mysql_query,您必须致电DB::prepare()
  • 而不是直接在查询中添加变量,您必须在execute()中传递它们,并在查询中用问号替换它们。

以下是一些使用示例

// with one variable
$sql  = "SELECT * FROM users WHERE name=?";
$user = DB::prepare($sql)->execute([$_POST['name']])->fetch();

// with two variables
$sql  = "SELECT * FROM users WHERE age > ? and skill = ?";
$user = DB::prepare($sql)->execute([$age, $skill])->fetch();

// without variables and getting more than one rows
$sql  = "SELECT * FROM users ORDER BY id DESC";
$user = DB::prepare($sql)->execute()->fetchAll();

//insert with getting insert id
$sql  = "INSERT INTO users VALUES (NULL,?,?,?)";
$user = DB::prepare($sql)->execute([$name,$pass,$email])->fetch();
$id   = DB::lastInsertId();

如果你根本不知道如何使用PDO,这里有tag wiki个基本用例。

简而言之,您必须分三步运行查询:

  • 制备
  • 执行

使用我的包装器,它们都可以链接。查看示例

当然,您必须遵循创建SQL语句的主要规则:每个变量都应仅通过占位符进行查询