从数据库中检索信息(1 个字段/对象;无数组)

Posted

技术标签:

【中文标题】从数据库中检索信息(1 个字段/对象;无数组)【英文标题】:Retrieving information from database (1 field/object; no arrays) 【发布时间】:2011-10-03 10:58:54 【问题描述】:

我正在为我的网站做一个登录页面,我现在正在测试,这个代码是在登录之后。问题是,我想从我的数据库中检索一些信息,但代码不起作用(它没有回显任何内容)。我检查了 mysql 查询是否正常并且可以正常工作,但是 php 中没有结果。

如果有任何帮助和答案,我会很高兴,

//---MySQL connection---//
$server = "localhost";
$user = "root";
$pass = "password";
$db = "users";
$table = "users";
mysql_connect($server,$user,$pass) or die(mysql_error());
mysql_select_db($db) or die(mysql_error());
//----------------------//

//---MySQL query, data selection---//
$sesuser = $_SESSION['username'];
$sql = "SELECT data FROM $table WHERE username='$sesuser'";
$predata = mysql_query($sql);
$data = mysql_fetch_field($predata);
//---------------------------------//

//---Check if session is registered---//
session_start();
if(session_is_registered("username"))
    echo "\n"."Hello ".$_SESSION["username"]."<br />";
    echo $data; //!!this line doesn't work

else
    echo "<script>window.location=/login/</script>";

//------------------------------------//
?>

【问题讨论】:

mysql_fetch_field 返回列信息,难道不是要该列的数据吗? echo $data;改成echo htmlspecialchars(print_r($data, true));再试一次。 @Fasand,永远不要将$_* superglobals 直接注入到查询中。这是一个 SQL 注入漏洞,使用 $var = mysql_real_escape_string($_SESSION['username']); 参见:***.com/questions/332365/… @hakre 是这样出来的:stdClass Object ( [name] => data [table] => users [def] => [max_length] => 9 [not_null] => 1 [primary_key] => 0 [multiple_key] => 0 [unique_key] => 0 [numeric] => 0 [blob] => 0 [type] => string [unsigned] => 0 [zerofill] => 0) 【参考方案1】:

session_start() 放在顶部或使用$_SESSION 变量之前

还有一件事:自 PHP 5.3.0 起,函数 session_is_registered 已被弃用。强烈建议不要依赖此功能。

更好的方法

session_start();
//---MySQL query, data selection---//
$sesuser = mysql_real_escape_string($_SESSION['username']);
$sql = "SELECT data FROM $table WHERE username='$sesuser'";
$predata = mysql_query($sql);
$data = mysql_fetch_field($predata);
//---------------------------------//

//---Check if session is registered---//

if(isset($_SESSION['username']))
    echo "\n"."Hello ".htmlentities($_SESSION["username"])."<br />";
    echo $data; 

else
    header("Location :"login.php");
    exit();

【讨论】:

谢谢,我使用了“session_is_registred”,因为我在一篇文章中找到了它并且它对我有用,所以我更多地关注 SQL 问题。但是当我把'session_start()'放在开始时,它仍然没有解决问题。但我认为'mysql_fetch_field'有一些问题,虽然我不知道是什么。【参考方案2】:

var_dump($data); - 说什么?

是的,但是session_start 在文件开头;

然后尝试(通过 php):

$i = 0;
while ($i < mysql_num_fields($result)) 
    echo "Information for column $i:<br />\n";
    $meta = mysql_fetch_field($result, $i);
    if (!$meta) 
        echo "No information available<br />\n";
    
    echo "<pre>
blob:         $meta->blob
max_length:   $meta->max_length
multiple_key: $meta->multiple_key
name:         $meta->name
not_null:     $meta->not_null
numeric:      $meta->numeric
primary_key:  $meta->primary_key
table:        $meta->table
type:         $meta->type
unique_key:   $meta->unique_key
unsigned:     $meta->unsigned
zerofill:     $meta->zerofill
</pre>";
    $i++;

如果您将mysql_fetch_field 更改为mysql_fetch_row,您将能够通过以下方式访问您的数据:$data[0];

【讨论】:

该代码中存在 XSS 安全漏洞。我建议使用htmlentities() 转义所有输出 笨蛋:object(stdClass)#1 (13) ["name"]=> string(4) "data" ["table"]=> string(5) "users" [ "def"]=> string(0) "" ["max_length"]=> int(9) ["not_null"]=> int(1) ["primary_key"]=> int(0) ["multiple_key"] => int(0) ["unique_key"]=> int(0) ["numeric"]=> int(0) ["blob"]=> int(0) ["type"]=> string(6) "字符串" ["无符号"]=> int(0) ["zerofill"]=> int(0) 【参考方案3】:

基本上在 $data 中返回了一个对象,您可以像这样回显它 $data->名称

【讨论】:

以上是关于从数据库中检索信息(1 个字段/对象;无数组)的主要内容,如果未能解决你的问题,请参考以下文章

如何从 JSON 数组中检索字符串数组?

使用 underscore.js 从对象/数组中仅检索一个字段

如何从数据库中检索单个字段数组数据并将它们分开 - 使用 laravel,PHP

如何从动态创建的表格视图单元格的输入字段中将数据检索到数组

从安装地图的阵列中检索信息(MapKit)

从文本字段中提取空数据。表已填充,但无法检索对象。 Java/JavaFX