Php PDO问题从mysql转换

时间:2013-05-10 01:27:34

标签: php mysql pdo

好吧,即使在尝试转换所有内容后的2天内,我仍然很难掌握PDO。

我现在正处于为$user_data['???']创建数组的阶段。这就是我所拥有的。

if (logged_in() === true) {
    $session_user_id = $_SESSION['user_id'];
    $user_data = user_data($session_user_id, 'id', 'username', 'password', 'email', 'active', 'coins');
    $user_id = $user_data['id'];
    if (user_active($user_data['username'] === false) {
        session_destroy();
        header('Location: index.php');
        exit();
    }
}

这就是我获取$user_data['???']数据的方式。随身携带的功能是..

function user_data($user_id){
    $data = array(); 
    $user_id = (int)$user_id;

    $func_num_args = func_num_args();
    $func_get_args = func_get_args();

    if ($func_num_args > 1) {
        unset($func_get_args[0]);

        $fields = '`' . implode('`, `', $func_get_args) . '`';
        $data = //mysql_fetch_assoc(//mysql_query("SELECT $fields FROM `users` WHERE `user_id` = $user_id"));

        return $data;
    }
}

function user_active($username) { 
    $username = sanitize($username);
    $query = //mysql_query("SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '$username' AND `active` = 1");
    return (//mysql_result($query, 0) == 1) ? true : false;
}

我正在试图弄清楚如何将其转换为PDO,有人能给我任何帮助吗?

此外,在我将其转换为PDO之后。如果用Welcome <?php $user_data['username'] ?>, Hope you enjoy your stay!的简单消息来欢迎用户,或者我现在需要使用完全不同的方法,是否会这么简单?

提前致谢!

2 个答案:

答案 0 :(得分:2)

因此,通过示例代码的外观,我得到的结论是您正在从已弃用的mysql扩展迁移到PDO。

mysql扩展可能会让你失望的是,如果你没有指定mysql链接资源mysql_query,它会使用由mysql_connect创建的最后创建的链接资源。一旦您转向使用PDO,您将不得不在user_datauser_active函数中使用PDO连接。最简单的方法是在每个函数中创建一个PDO连接,它非常重复,根本不是一个好的解决方案,但它可以工作。

代码中存在sql injection个漏洞的问题。除此之外,您可以编写如下函数:

<?php

function user_data($user_id){
  $data = array(); 
  $user_id = (int)$user_id;

  $func_num_args = func_num_args();
  $func_get_args = func_get_args();

  if ($func_num_args > 1) {
    unset($func_get_args[0]);

    // connect to the DB
    $dsn = 'mysql:dbname=<your_db_name>;host=127.0.0.1';
    $user = '<your_db_user>';
    $password = '<your_db_user_password>';
    $dbh = new PDO($dsn, $user, $password);

    // request the data
    $fields = '`' . implode('`, `', $func_get_args) . '`';
    $sql = sprintf('select %s from users where user_id = ? limit 1', $fields);
    $stmt = $dbh->prepare($sql);
    $stmt->execute(array($userid));
    $data = $stmt->fetch(PDO::FETCH_ASSOC);

    return $data;
  }
}

function user_active($username) { 
  $username = sanitize($username);

  // connect to the DB
  $dsn = 'mysql:dbname=<your_db_name>;host=127.0.0.1';
  $user = '<your_db_user>';
  $password = '<your_db_user_password>';
  $dbh = new PDO($dsn, $user, $password);

  $sql = 'select count(user_id) from users where username = ? and active';
  $stmt = $dbh->prepare($sql);
  $stmt->execute(array($username));

  return $stmt->fetchColumn() == 1;      

}  

希望它有所帮助。

答案 1 :(得分:0)

首先,您必须使用连接。 PDO是OO:

$db = new PDO("mysql:host=127.0.0.1;dbname=somedb",'root');

然后你得到行:

$rows = $db->query('select name from People');

你的功能应该是这样的:

function user_data($user_id,$db){
    $data = array(); 
    $user_id = (int)$user_id;
    $func_num_args = func_num_args();
    $func_get_args = func_get_args();

    if ($func_num_args > 1) {
        unset($func_get_args[0]);

        $fields = '`' . implode('`, `', $func_get_args) . '`';
        $data = $db->query("SELECT $fields FROM `users` WHERE `user_id` = $user_id");

        return $data;
    }
}



function user_active($username,$db) { 
    $username = sanitize($username);
    $data = $db->query("SELECT COUNT(`user_id`) qtd FROM `users` WHERE `username` = '$username' AND `active` = 1");
    return ($data['qtd'] == 1) ? true : false;
}

其中$ db是具有有效连接的PDO实例。所以,如果我们有一个脚本来调用函数,它应该是这样的:

<?php
  import "file_where_functions_are_defined.php";
  $db = new PDO("mysql:host=127.0.0.1;dbname=somedb",'root');
  $user_data = user_data(1,$db);
?>