[英]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.