我正在学习PDO语句,以便更好地保护数据库。我在某地读到mysql_ *函数将完全弃用。因此,为了避免Web应用程序出现任何形式的错误,我将转向PDO语句。
我想在PDO语句中编写已编写的mysql_ *语句。
我已将与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语句。
我的方法是将它用作公共文件,并在我想要的任何页面上使用mysql PDO语句。
答案 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语句的主要规则:每个变量都应仅通过占位符进行查询