用binql的PHP bin2hex

时间:2013-08-15 11:41:59

标签: php mysql database

我正在为PHP中的web服务创建授权通道。在前两行中,我创建了一个随机的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; }

2 个答案:

答案 0 :(得分:0)

我猜你的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呢?

我建议搜索您的身份验证令牌实际上成功,但是您通过从第一个查询中插入整个结果集 object 来搜索fname ,而不是单个列的价值。所以第二个查询没有正确搜索。

除非您的查询结果对象内置了非常智能的__toString()方法。

答案 1 :(得分:0)

非常感谢大家。该脚本运行正常。我错误地在数据库中设置user_auth_token 18的长度而不是37。再次感谢。