Php 查询返回空时出现语法错误或访问冲突

Php 查询返回空时出现语法错误或访问冲突,php,mysql,laravel,Php,Mysql,Laravel,如果查询没有返回任何内容,我会遇到一些奇怪的错误。我怎样才能妥善处理这件事 错误: SQLSTATE[42000]:语法错误或访问冲突:1064您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以了解在第1行附近要使用的正确语法:选择users.uid、first_name、last_name、IFNULLfiles.filename、'default.jpg'作为头像,用户隐私左加入用户头像上的用户头像。uid=user_avatars.uid左加入用户头像上的文件。fid=fi

如果查询没有返回任何内容,我会遇到一些奇怪的错误。我怎样才能妥善处理这件事

错误:

SQLSTATE[42000]:语法错误或访问冲突:1064您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以了解在第1行附近要使用的正确语法:选择users.uid、first_name、last_name、IFNULLfiles.filename、'default.jpg'作为头像,用户隐私左加入用户头像上的用户头像。uid=user_avatars.uid左加入用户头像上的文件。fid=files.fid where users.uid

代码:

更新

我尝试添加dievar_dump$contacts;但它返回了很多与拉威尔有关的物体

另一方面,如果我添加?page=1,那么它将成功返回2个联系人。 如果我加上?page=2,它就会给出错误。可能是因为没有数据,但我想妥善处理

 if ($contacts != null) {
    $users_id = array();

    foreach ($contacts as $contact) {
        $users_id[] = $contact->user_id;
    }

您的代码的这一部分工作不正常。进行var_转储$contacts;看看它到底是什么,因为它不能为null,看起来它只是一个空数组。

您需要在这行中添加一些逻辑

>whereIn('users.uid', $users_id)
既然你已经把电话链接起来了,你不能简单地在那条线上加一个if,因为它在逻辑上无论如何都是可行的。也许这样就行了

if ($users_id){
$data = DB::table('users')
                            ->leftJoin('user_avatars', 'users.uid', '=', 'user_avatars.uid')
                            ->leftJoin('files', 'user_avatars.fid', '=', 'files.fid')
                            ->whereIn('users.uid', $users_id)
                            ->select('users.uid', 'first_name', 'last_name', DB::raw('IFNULL(files.filename, \'default.jpg\') AS avatar'), 'privacy')
                            ->get();
} else {$data = null; /*or empty set however that is defined in your framework*/ }

在MySQL中,您不能用In传递空数据集。例如,从用户中选择id,其中SQL中的id无效。拉威尔不够精明,无法纠正这个问题;所以你需要做出调整。快速修复方法是将非成员(如0)附加到数据集。在这种情况下,假设没有数据的主键为0可能是安全的

例如,在代码中:

$users_id = array(0);

foreach ($contacts as $contact) {
    $users_id[] = $contact->user_id;
}

我添加了dievar_dump$contacts;它似乎返回了一个很长的物体,里面有很多拉威尔的东西。更详细地说,它在中生成了SQL…users.uid,这是一个语法错误。不能有空列表。好的,列表顶部的对象类型/类名是什么我将var更改为$users\u id=array0;现在,if在列表中给出一个0作为默认值。但有更好的解决办法吗?还是我用的那个可以?我期望有数百万用户的流量。您可以向$users\u id数组添加一个简单的计数,如果$users\u id至少有一个值,则只运行第二个查询。我所做的是编辑$users\u id=array;到$users\u id=array0;现在它没有给出错误。但我现在的问题是,有没有更好或更有效的方法来处理这个问题?是的,框架应该能够以某种方式处理这个问题,但老实说,我认为如果有用户,您的修复程序根本不可能是修复程序。uid=0行。。可能没有,但使用编写的代码运行是有风险的。您确实不需要空数组上的条件-或者您需要自动不返回任何行,甚至不运行查询,或者您需要忽略该条件,因为它将在sql中始终创建此语法错误。您是否尝试过我的代码?它也会更高效,不会让数据库服务器落后于不必要的查询。所以你建议我只检查users\u id是否包含任何内容,然后运行我的查询?如果没有,那么根本不运行查询?是的,我尝试了你的代码。它起作用了。我将接受这个答案
$users_id = array(0);

foreach ($contacts as $contact) {
    $users_id[] = $contact->user_id;
}