2

我曾经在我的脚本中对任何选择查询都有一个函数,但由于它不安全,我需要了解如何在 php.ini 中创建动态 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 行来进行查询,有没有办法让函数或类接受查询并返回数据?

谢谢你。

4

3 回答 3

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()但仅返回第一个结果。您还可以考虑为插入语句编写一个包装器,返回最后插入的标识符。

结论

考虑到所有因素,我个人认为这些包装器并没有增加太多仅使用 PDO 所不具备的功能。

顺便说一句,使用 PDO 时,请确保允许从 PDO 抛出异常;这有助于调试您的代码并避免笨拙的代码。

于 2012-05-05T06:28:38.340 回答
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 注入。

于 2012-05-05T06:45:16.973 回答
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);
于 2012-05-05T07:01:40.603 回答