动态类或函数返回查询结果PDO

时间:2012-05-05 06:22:15

标签: php mysql pdo

我曾经在我的脚本中为任何选择查询提供了一个函数,但由于它不安全,我需要找出如何在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行来进行查询,有没有办法让函数或类接受查询并返回数据?

谢谢。

3 个答案:

答案 0 :(得分:1)

对于使用PDO的辅助函数,您有几个选择:

  • 将PDO对象与$query
  • 一起传递
  • 使用某种形式的工厂类,在您需要时实例化您的PDO。

第一个可能看起来像这样:

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);