我正在为PHP中的PHP服务创建一个授权通道。在前两行中,我对数据库中的用户设置了一个随机的18字节十六进制数,并将相同的auth_token发送给另一端的用户。但是,当用户发送相同的auth_token来获取某些数据时,脚本无法搜索数据库。在数据库中查询的十六进制代码存在一些问题。请帮帮忙。
$hex = bin2hex(openssl_random_pseudo_bytes('18'));
$database->executeObject('UPDATE tbluser SET user_auth_token="'.$hex.'" WHERE user_name="'.$_POST['uid'].'"');
...
...
...
}elseif ( $_POST['query'] = "fetch" && !empty($_POST['auth_token']) ){
$token = $_POST['auth_token'];
$uid = $database->executeObject('SELECT user_id AS id FROM tbluser WHERE user_auth_token="'.$token.'"');
if (!empty($uid)){
$fname = $database->executeObject('SELECT writer_first_name as fname FROM tblwriter WHERE user_id="'.$uid.'"')->fname;
echo $fname;
exit;
}else{ echo "Not Authorized"; exit; }发布于 2013-08-15 19:49:54
我猜是您的executeObject()函数,但看起来您使用它的方式并不一致。
第一次调用它时,您希望它返回一个标量user_id。
$uid = $database->executeObject('SELECT user_id AS id FROM tbluser
WHERE user_auth_token="'.$token.'"');$uid现在是包含一个结果集对象,还是在一行中包含用户id的单个值?我建议$uid包含一个结果集。
但是第二次调用executeObject()时,您希望它返回一个对象,并且需要引用一个特定的字段fname来获取该列的值。
if (!empty($uid)){
$fname = $database->executeObject('SELECT writer_first_name as fname
FROM tblwriter WHERE user_id="'.$uid.'"')->fname;
echo $fname;
exit;看起来您需要使用->fname来获取单个列的值。那么,为什么在第一个查询中使用->user_id呢?
我建议对auth标记的搜索实际上是成功的,但是您可以通过插入第一个查询中的整个结果集对象来搜索fname,而不是插入单个列的值。因此,第二个查询没有正确搜索。
除非查询结果对象中内置了非常智能的__toString()方法。
发布于 2013-08-16 02:09:42
非常感谢大家。这个脚本运行得很好。我在数据库中错误地设置了user_auth_token 18的长度,而不是37。再次感谢。
https://stackoverflow.com/questions/18251961
复制相似问题