【问题标题】:Php PDO issues translating from mysql从 mysql 转换的 PHP PDO 问题
【发布时间】:2013-05-10 01:27:34
【问题描述】:

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

我现在正处于为 $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! 消息表示欢迎用户会那么简单,还是我现在需要使用完全不同的方法?

提前致谢!

【问题讨论】:

  • 阅读其他问题的答案。它会为你节省很多头发。

标签: php mysql pdo


【解决方案1】:

因此,从示例代码的外观来看,我的印象是您正在从已弃用的 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;      

}  

希望对你有帮助。

【讨论】:

  • 非常感谢您的回复。
【解决方案2】:

首先,您必须处理连接。 PDO 是面向对象的:

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

【讨论】:

  • 没有密码?另外,为什么要从每个函数内部开始一个新的 PDO 连接?
  • 只是为了回答你的问题。您可以创建一个变量以在这两个函数中使用它。如果将它封装在一个类中并使用单例仅保持一个连接应该会更好。关于密码,这取决于您的服务器是如何配置的。我的本地机器不需要密码。你需要让它适应你的世界。
  • 无论如何,您不应该为多个连接字符串提供示例。如果 OP 将按原样使用它并进行轻微更改但保留您的基本结构.. 永远他会更改站点/数据库.. 他会因密码不匹配而收到很多不需要的错误...访问内部的 $db 变量函数使用global
  • @JoseAreas 您应对您提供的代码负责。每个答案都有望为将来遇到的许多人服务。编写糟糕的代码意味着所有这些人都会分享这种糟糕的做法。所以,“只是回答”不是借口。要么给出正确答案,要么根本不写。
  • 一个有点有趣的事实:在他们之前的回答中,OP已经使用了非常 DI 方法,甚至是类型提示的方法。但由于某种原因不在这个。
猜你喜欢
  • 2019-11-07
  • 2017-11-19
  • 1970-01-01
  • 1970-01-01
  • 2014-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多