1

所以我正在努力将我之前做过的旧教程mySQLPDO. 这样我可以更好地理解这些概念。然而,我似乎撞到了墙上。以下功能给了我一个错误

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) . '`'; // !! LINE 12
        try {           
            $sql = sprintf('SELECT %s FROM members WHERE id = ?', $fields);         
            $stmt = $db->prepare($sql);
            $stmt->execute(array($user_id));
            $data = $stmt->fetch(PDO::FETCH_ASSOC);         
            return $data;           
        } catch(PDOException $e) {
            die($e->getMessage());
        }
    }
}

这是我调用函数的地方

<?php 
session_start();
require 'database/connect_db.php';
require 'functions/users.php';

if (signedIn() === true) {
    $session_id = $_SESSION['id'];
    $user_data = user_data($session_id, $db, 'email', 'password', 'role', 'name', 'company', 'title', 'phone', 'address', 'city', 'zip', 'state', 'ext', 'pic');
    echo $user_data['name'];
}

?>

这是我的错误

Catchable fatal error: Object of class PDO could not be converted to string in C:\xampp\htdocs\core\functions\users.php on line 12

所以更具体地说,正如上面函数中所评论的那样

$fields = '`' . implode('`, `', $func_get_args) . '`';

我不明白为什么这条线会导致这个错误。我也不知道如何解决它。任何帮助表示赞赏。

4

3 回答 3

3

问题是当您使用func_get_args它时试图将您的$db参数格式化为字符串。

我稍微修改了你的代码,而不是为第三个参数传递一个数组

function user_data($user_id, $db, $select = array()) {
    if (count($select)) $fields = "`".implode('`, `', $select)."`";
    else $fields = "*";

    try {
        $stmt = $db->prepare("SELECT {$fields} FROM members WHERE id=?");              
        $stmt->execute(array($user_id));
        return $stmt->fetch(PDO::FETCH_ASSOC);
    } catch(PDOException $e) {
        die($e->getMessage());
    }
}

你现在调用这个函数的方式是这样的:

$user_array = array('email', 'password', 'role', 'name', 'company', 'title', 'phone', 'address', 'city', 'zip', 'state', 'ext', 'pic');
$user_data = user_data($session_id, $db, $user_array);

希望这适合您的喜好!

于 2013-07-24T02:48:48.960 回答
2

您最后的功能参数是 PDO,您必须使用array_pop从字段列表中删除它。

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();

    array_pop($func_get_args);        //<----------------------- line added

    if($func_num_args > 1) {
    // unset($func_get_args[0]);      // <---------------------- line commented
        $fields = '`' . implode('`, `', $func_get_args) . '`'; // !! LINE 12
        try {           
            $sql = sprintf('select %s from users where user_id = ?', $fields);          
            $stmt = $dbh->prepare($sql);
            $stmt->execute(array($userid));
            $data = $stmt->fetch(PDO::FETCH_ASSOC);         
            return $data;           
        } catch(PDOException $e) {
            die($e->getMessage());
        }
    }
}
于 2013-07-24T02:42:52.543 回答
1

func_get_args() 返回函数的所有参数。您 unset() 第 0 个元素,但是您需要从 args 的开头删除两个元素。我在下面展示了一个使用 array_slice() 从元素 2 开始的示例。

此外,您的函数有一个明显的 SQL 注入漏洞,将列名列表直接插入到您的 SQL 选择列表中。您应该根据 users 表的所有列的列表将输入列入白名单,以确保输入不包含您不期望的内容。

function user_data($user_id, PDO $db) {
    // hardcoded list of the columns in the users table; use this as an allowlist
    $all_users_columns = array('first_name', 'last_name', 'email', /* etc. */);

    $columns = array_intersect(array_slice(func_get_args(), 2),
                               $all_users_columns);

    if($columns) {
        $column_list = implode(",", 
            array_map(function($col) { return "`$col`"; }, $columns));
        try {           
            $sql = sprintf('select %s from users where user_id = ?', $column_list);          
            $stmt = $db->prepare($sql);
            $stmt->execute(array((int)$userid));
            $data = $stmt->fetch(PDO::FETCH_ASSOC);         
            return $data;           
        } catch(PDOException $e) {
            die($e->getMessage());
        }
    }
}
于 2013-07-24T02:55:23.087 回答