当我学习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,然后使用此会话信息收集该用户的所有信息。
答案 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::fetchColumn
是mysql_result
的最接近的等价物,但不能完全相同。