Laravel 4中带有IN的DB::raw查询在WHERE子句中与MySQL的参数不起作用。

11 浏览
0 Comments

Laravel 4中带有IN的DB::raw查询在WHERE子句中与MySQL的参数不起作用。

当我在Laravel 4中使用DB:select DB:raw查询针对MySQL执行以下查询时,它返回的结果为空。 (注意,我为了这个例子截断了实际的查询。)

SELECT user_id, email, first_name, last_name, photo_small
FROM users AS u
JOIN profiles AS p ON p.user_id = u.id
 WHERE email IN (?) ....

其中$p= "email.address1@com","xyz.xxx@.edu",$p是参数。

然而,当我执行以下操作时

SELECT user_id, email, first_name, last_name, photo_small
FROM users AS u
JOIN profiles AS p ON p.user_id = u.id
 WHERE email IN ("email.address1@com","xyz.xxx@.edu") ....

我得到了结果。

我已经确认了参数的值,使用DB::getQueryLog()检查了SQL和绑定,并使用单独的数据库工具验证了结果。

出于明显的原因,我真的想避免使用非参数化查询,但似乎无法使其返回任何结果,即使它是有效的SQL。

欢迎任何建议。

0
0 Comments

Laravel 4中的DB::raw查询在WHERE子句中使用IN无法处理带有MySQL参数的问题的原因可能是由于Laravel在处理参数绑定时的机制造成的。在这种情况下,解决方法是将参数转换为字符串,并将其直接注入SQL查询中。虽然这种方法不够优雅和安全,但在我找到的解决方案中,这是唯一有效的方法。在注入之前,请确保检查了创建子字符串时的所有可能情况!

以下是一个示例代码,说明如何使用上述方法解决问题:

$array = [...];
$stringList = implode(",", $array);
$result = DB::select('....... WHERE id IN ('.$stringList.')');

上述代码将数组转换为逗号分隔的字符串,并将其直接注入到查询中,从而实现了IN子句的功能。

需要注意的是,这种方法不使用绑定/准备语句,可能存在安全风险,请确保在使用之前对注入的值进行适当的验证和过滤。

0
0 Comments

问题的出现原因是因为使用Laravel 4的DB::raw查询时,在WHERE子句中使用带有MySQL参数的IN运算符是无效的。这是因为底层机制是PDO,它要求每个参数都有一个值。虽然你试图欺骗PDO接受一个逗号分隔的参数列表,但这是行不通的。

为了解决这个问题,可以参考stackoverflow上的一个解决方案:PDO with "WHERE... IN" queries。你可以参考majimboo的解决方案,并添加一些代码来遍历你的值数组,并生成相应的IN语句,例如:

WHERE id IN (:val1, :val2, etc)

或者你也可以尝试将其渲染为:

WHERE id IN (?, ?, ?)

然后将实际替换值的数组传递进去。

然而,我同意majimboo的观点,你应该可以使用查询构建器来完成这个查询。它提供了whereIn()方法来帮助你处理查询的这一部分,这样你就不需要编写自己的查询语法生成代码。

嗯,我会尝试确认一下。

0
0 Comments

Laravel 4中在WHERE子句中使用带有参数的DB::raw查询与MySQL中的IN操作无法正常工作。问题出现的原因是Laravel 4中的DB::raw方法无法正确处理参数化查询中的IN操作。

要解决这个问题,可以使用以下方法来动态参数化值。以下示例是针对一个ID列表的情况,但是可以根据需要进行适当的调整。

public function getDataByIds($idArray)
{
    $parametersString = "";
    $parameters = [];
    for($i=0; $igetQuery("SELECT blah WHERE id IN (".$parametersString.")");
    return DB::select(DB::raw($query), $parameters);
}

以上代码通过循环遍历ID数组,将每个ID转换为参数化查询中的参数,并构建参数字符串。然后,使用参数化查询构建完整的查询语句,并使用DB::select方法执行查询。通过这种方式,可以正确处理参数化查询中的IN操作,并避免了Laravel 4中DB::raw方法的限制。

0