PDO替代mysql_获取字段信息

时间:2015-05-14 18:43:33

标签: php mysql pdo

当我学习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,然后使用此会话信息收集该用户的所有信息。

3 个答案:

答案 0 :(得分:1)

以下是使用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 :(得分:0)

实现目标有两种可能性:

选项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;
}

我更喜欢第一种变体。

答案 2 :(得分:0)

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

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::fetchColumnmysql_result的最接近的等价物,但不能完全相同。