繁体   English   中英

PDO替代mysql_以获得字段信息

[英]PDO alternative to mysql_ for getting field info

当我学习php时,我从显然较旧的指南中学习了,并且一直在使用mysql_函数。 我将所有内容都切换到PDO,并且确实有要保留的功能,但我不太想知道如何更改它。 这是mysql_函数。

function getfield($field){
  $query = "SELECT $field FROM users WHERE id='".$_SESSION['user_id']."'";
  if($query_run = mysql_query($query)){
     if ($query_result = mysql_result($query_run, 0, $field)){
      return $query_result;
     }
  }

}

从中我可以得到我想要的任何领域。 但是,它使用的是mysql_的东西,我听说它已被弃用,并且很快就会淘汰。 此功能从您登录时获取会话ID,然后使用此会话信息收集该用户的所有信息。

这是使用PDO的功能的简单示例。 我在代码中留下了一些注释,以帮助您理解这个想法。

function getField($field) {
    // Assuming you already obtained your connection here.
    // For the purpose of showing you an example I will name my database connection with variable $db

    // First check if we have user_id in our session, and then sanitize it.
    // never query the database with unsanitized data. 
    $userId = isset($_SESSION['user_id']) ? filter_var($_SESSION['user_id'], FILTER_SANITIZE_NUMBER_INT) : null;

    // If the user_id is not presented, then we don't need to query the database at all. Return null or whatever suits your needs
    if( ! $userId ) {
        return null;
    }

    // Build the query
    $sql = sprintf(
        "SELECT `%s` FROM `users` WHERE `id` = :userId LIMIT 1",
        $field
    );

    // Prepare the statement to be executed
    // More to read about prepared statements: http://php.net/manual/en/pdo.prepare.php
    $query = $db->prepare($sql);

    // Pass the user id to our prepared query
    // More to read about binding parameters: http://php.net/manual/en/pdostatement.bindparam.php
    $query->bindParam(':userId', $userId);

    // Execute the query
    $query->execute();

    // Return single result
    return $query->fetch(PDO::FETCH_ASSOC);
}

如有任何疑问,请随时提出。

-根据OP评论进行更新-

使用上述函数,由于以下原因,最终将得到数组结果:

  • ->fetch()PDO::FETCH_ASSOC选项结合使用,如果找到结果,将返回其中包含单个项目的数组。 在这种情况下,该数组中的key将是字段名称。

现在,您可以使用以下方式访问值:

$result = getField('username');
print $result['username'];

或在您的职能中:

$result = $query->fetch(PDO::FETCH_ASSOC);
if( isset($result[ $field ] ) {
    return $result[ $field ];
}

return null;

有两种实现目标的可能性:

选项1 SELECT *因此您的功能可能类似于:

function getfield($field){
    $res = null;

    $dsn = 'mydb';
    $user = '';
    $password = '';

    $dbh = new PDO($dsn, $user, $password);

    $query = "SELECT * FROM users WHERE id = ?";
    $stmt = $dbh->prepare($query);
    $stmt->bindValue(1,$_SESSION['user_id']);
    $stmt->execute();
    if ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        if (isset($row[$field])) 
           $res = $row[$field];
    }
    return $res;
}

选项2预定义的可接受列名:

function getfield($field){
    $acceptedArr = array('name','date_of_birth','age');
    $res = null;
    if (in_array($field,$acceptedArr)) {

      $dsn = 'mydb';
      $user = '';
      $password = '';

      $dbh = new PDO($dsn, $user, $password);

      $query = "SELECT $field FROM users WHERE id = ?";
      $stmt = $dbh->prepare($query);
      $stmt->bindValue(1,$_SESSION['user_id']);
      $stmt->execute();
      if ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        $res = $row[$field];
      }
    }
    return $res;
}

我更喜欢第一种。

有很多方法可以做到这一点。 还有一个是:

function getfield(PDO $dbh, $field) {
    return $dbh->query(
        'SELECT `' . str_replace('`', '``', $field) . '` FROM users WHERE id = ' . intval($_SESSION['user_id'])
    )->fetchColumn();
}

记住没有内部的全局连接了,像Alex一样在每个函数调用上创建一个全局连接是一个非常糟糕的主意。 在这里,我们只是将其作为参数传递。

同样,保护$field也是一个好主意。

我想我们可以假设在其他地方之前先检查了$_SESSION['user_id']存在性(isset)。

最后, PDOStatement::fetchColumn是与mysql_result最接近的等效项,但不能完全一样地工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM