所以我正在努力转换从mySQL
到PDO
的一段旧教程。这样我就能更好地理解这些概念。然而,我似乎碰到了一堵墙。以下功能给我一个错误
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) . '`';
我不明白为什么这一行导致了这个错误。我也不知道如何解决它。任何帮助表示赞赏。
答案 0 :(得分: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);
希望这适合您的喜好!
答案 1 :(得分: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());
}
}
}
答案 2 :(得分:1)
func_get_args()返回 all 函数的参数。你取消设置()第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 a whitelist
$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());
}
}
}