Vic*_*tor 6 php sql laravel laravel-4
我的数据库中有3个表:
一家公司可能有一些用户.一个用户可能有一些活动.用户(具有管理员权限)可以对属于其公司的任何广告系列执行某些操作.所以,我想检查他是否正在与他的竞选活动一起做这些行动(在最后一种情况下,我返回的内容如"拒绝访问").
我的病情
Campaign::join('users', 'users.id', '=', 'campaigns.user_id')
->where('users.company_id', '=', Auth::user()->company->id)
->where('campaigns.id', '=', Input::get('id'))
->first();
Run Code Online (Sandbox Code Playgroud)
因此,如果我获得了独特的广告系列 - 没关系,如果我得到了空 - 出了点问题,我向用户发送了"拒绝访问权限",因为他正在处理其他公司广告系列.
此代码生成下一个查询:
array(3) {
["query"]=>
string(148) "select * from `campaigns` inner join `users` on `users`.`id` = `campaigns`.`user_id` where `users`.`company_id` = ? and `campaigns`.`id` = ? limit 1"
["bindings"]=>
array(2) {
[0]=>
string(1) "2"
[1]=>
string(2) "13"
}
["time"]=>
float(0.42)
}
Run Code Online (Sandbox Code Playgroud)
使用phpmyadmin我尝试了相同的查询并获得了ID = 13的广告系列.但是当我调试我的应用程序时,我发现了这一点
dd($campaign->id);
Run Code Online (Sandbox Code Playgroud)
而是返回8.8也等于campaigns.user_id(记录有campaigns.id和campaigns.user_id = 8).
我无法弄清楚为什么会这样.即使我的SQL查询有问题(我怀疑是phpmyadmin返回正确的结果),我得到了条件campaigns.id = Input::get('id'),在哪里Input::get('id') = 13.为什么id正在改变?
当然,我可以通过两个步骤进行安全检查,比如先获得广告系列,然后检查,
$campaign->user->company->id = Auth::user()->company->id但只是想知道......
Mat*_*röm 23
如果您在phpMyAdmin中运行此查询,您应该可以看到结果包含名称为" id "的多个列.当PHP将查询结果解析为关联数组或对象时,键必须是唯一的!如果键发生碰撞,将使用最后一列!
例:
SQL结果:
id user_id name id name company_id
1 2 Camp1 2 Pelle 1
Run Code Online (Sandbox Code Playgroud)
PHP结果:
array (size=1)
0 =>
object(stdClass)[131]
public 'id' => string '2' (length=1)
public 'user_id' => string '2' (length=1)
public 'name' => string 'Pelle' (length=5)
public 'company_id' => string '1' (length=1)
Run Code Online (Sandbox Code Playgroud)
要解决此问题,您可以添加一个select子句,仅选择广告系列列:
Campaign::select('campaigns.*')
->join('users', 'users.id', '=', 'campaigns.user_id')
->where('users.company_id', '=', Auth::user()->company->id)
->where('campaigns.id', '=', Input::get('id'))
->first();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4447 次 |
| 最近记录: |