我曾经在我的脚本中为任何选择查询提供了一个函数,但由于它不安全,我需要找出如何在php中创建动态PDO类。
例如,我曾经使用过此代码。
function excute_query ($Query)
{
if($Query_Run = mysql_query($Query))
{
while($DATA = mysql_fetch_array($Query_Run, MYSQL_ASSOC))
{
$data_array[] = $DATA;
}
return $data_array;
close();
}
else{
die(mysql_error());
}
mysql_close();
}
我可以在我的脚本中的任何地方使用它,它返回一个包含数据的数组。在2行。
$sql = 'SELECT * FROM users';
$users = execute_query($sql);
现在我需要在PDO中使用相同的功能。我一直在努力,但是如何使用PDO创建类或函数来做同样的事情。
我想说的是什么。而不是写相同的4行来进行查询,有没有办法让函数或类接受查询并返回数据?
谢谢。
答案 0 :(得分:1)
对于使用PDO的辅助函数,您有几个选择:
$query
第一个可能看起来像这样:
function queryGetAll(PDO $pdo, $query)
{
return $pdo->query($query)->fetchAll(PDO::FETCH_ASSOC);
}
您可以通过添加对预准备语句的支持来使其更有用。
function queryGetAll(PDO $pdo, $query, $params = array(), $style = PDO::FETCH_ASSOC)
{
$stmt = $pdo->prepare($query);
$stmt->execute($params);
return $stmt->fetchAll($style);
}
打电话给:
$results = queryGetAll($pdo, "SELECT * FROM users WHERE uid = ?", array($user_id));
您可以编写的另一个包装器是queryGetOne()
,它类似于queryGetAll()
但只返回第一个结果。您还可以考虑为insert语句编写包装器,返回最后插入的标识符。
<强>结论强>
考虑到所有因素,我个人并不认为这些包装器增加了许多仅使用PDO尚未提供的功能。
顺便说一下,使用PDO时,请确保允许exceptions to be thrown from PDO;这有助于调试代码并避免笨重的代码。
答案 1 :(得分:1)
你的代码很糟糕。认真。永远不会调用close()
函数,因为它位于return
语句之后。由于同样的原因,mysql_close()
从未被调用过。
那就是说,这是我要使用的功能:
function execute_query( $con, $query, $statements ) {
$q = $con->prepare( $query );
foreach ( $statements as $statement ) {
$q->bindParam( $statement[ 'string' ], $statement[ 'value' ], $statement[ 'type' ] );
}
$q->execute();
return $q->fetchAll();
}
以下是使用它的代码示例:
$con = new PDO( /* ... */ );
$query = "SELECT * FROM users WHERE id = :id";
$statements = array();
// Prepare a statement array
$id = array(
'string' => ':id',
'value' => $_GET[ 'id' ],
'type' => PDO::PARAM_INT
);
// Add the statement to the array
$statements[] = $id;
$results = execute_query( $con, $query, $statements );
PDO的详细信息附带准备好的语句,可以提供良好的安全性。准备语句意味着您可以安全地进行SQL注入。
答案 2 :(得分:0)
这是一个快速而肮脏但很简单的解决方案
function execute_query( $query, $params ) {
global $pdo;
$stmt = $pdo->prepare( $query );
$stmt->execute($params);
return $stmt->fetchAll();
}
$users = execute_query('SELECT * FROM users WHERE id=?',array($id));
但我个人不喜欢写array
这个词,所以,我会使用func_get_args()
并按此方式调用
function execute_query() {
global $pdo;
$args = func_get_args();
$query = array_shift($args);
$stmt = $pdo->prepare($query);
$stmt->execute($args);
return $stmt->fetchAll();
}
$sql = 'SELECT * FROM users WHERE username=? AND password=?';
$found = execute_query($sql,$username,$password);
但是上课会显然更好 它将让您为不同的结果集提供不同的功能,例如
$username = db::getOne('SELECT name FROM users WHERE id=?',$id);
而不是你当前的
$user = execute_query('SELECT name FROM users WHERE id=?',$id);
$username = $user['name'];
或更有用的
$users = db::getIndexed('id','SELECT name FROM users);
获取一个数组,其中键中包含用户ID或
$ids = db::getCol('SELECT id FROM users');
$in = implode(",",$ids);