我有一个名为sqlf()的函数,它模拟预处理语句。 例如,我可以做以下事情:

$sql = sqlf("SELECT * FROM Users WHERE name= :1 AND email= :2",'Big "John"','bj@example.com') ;

由于各种原因,我不能使用预备语句,但我想模仿它们。 我遇到的问题是像查询一样

$sql = sqlf("SELECT * FROM Users WHERE id IN (:1)",array(1,2,3) );

我的代码工作,但它失败了空数组,例如以下抛出一个mysql错误:

SELECT * FROM Users WHERE id IN ();

有没有人有什么建议? 我应该如何将数组转换为可以注入IN子句的sql? 替换NULL将不起作用。

#1楼 票数:7 已采纳

Null是唯一可以保证不在集合中的值。 怎么不是一个选择? 任何其他东西都可以被视为潜在集合的一部分,它们都是价值观。

#2楼 票数:1

我会说传递一个空数组作为IN()子句的参数是一个错误。 调用此函数时,您可以控制查询的语法,因此您还应该对输入负责。 我建议在调用函数之前检查参数的空虚。

#3楼 票数:0

是否有可能使用sqlf检测空数组并将SQL更改为不具有IN子句?

换句话说,您可以在将SQL传递给“真正的”SQL执行器之前对其进行后处理,以便删除“IN()”部分,尽管您必须执行各种技巧以查看必须删除的其他元素,以便:

SELECT * FROM Users WHERE id IN ();
SELECT * FROM Users WHERE a = 7 AND id IN ();
SELECT * FROM Users WHERE id IN () OR a = 9;

会成为:

SELECT * FROM Users;
SELECT * FROM Users WHERE a = 7;
SELECT * FROM Users WHERE a = 9;

根据SQL的复杂性,这可能会变得棘手 - 您基本上需要一个完整的SQL语言解释器。

#4楼 票数:0

如果你的类似prepare的函数只是用等效参数替换:1,你可能会尝试让你的查询包含类似(':1')的东西,这样如果:1为空,它会解析为(''),这不会导致解析错误(但是如果该字段可以包含空值,则可能会导致不良行为 - 尽管如果它是int,这不是问题)。 然而,这不是一个非常干净的解决方案,你最好检测数组是否为空并且只使用缺少“IN(:1)”组件的备用版本的查询。 (如果这是WHERE子句中唯一的逻辑,那么可能你不想选择所有内容,所以你根本就不会执行查询。)

#5楼 票数:0

我会使用零,假设你的“id”列是一个自动分配数字的伪代码。

据我所知,大多数品牌数据库中的自动密钥生成器从1开始。这是一个约定,而不是一个要求(标准SQL中没有定义自动编号字段)。 但是这个惯例很常见,你可以依赖它。

由于零可能永远不会出现在“id”列中,因此当输入数组为空时,可以在IN()谓词中使用此值,并且它永远不会匹配。

#6楼 票数:-1

我能想到的唯一方法是让你的sqlf()函数扫描一下,查看特定的替换是否在“IN(”之后很快就会出现,然后如果传递的变量是一个空数组,那就放入你知道的东西肯定不会出现在那一列: "m,znmzcb~~1" ,例如。这是一个黑客,当然可以。

如果你想更进一步,你可以改变你的功能,以便有不同类型的替换? 看起来您的函数扫描冒号后跟一个数字。 为什么不添加另一种类型,比如@后跟一个数字,这对于清空数组是明智的(这使您无需扫描并猜测该变量是否应该是一个数组)。

  ask by jcampbell1 translate from so

未解决问题?本站智能推荐:

1回复

未找到列:1054未知列'users.blog_id':SQL:从`users`中选择*其中`users` .blog_id` = 1且`users``blog_id`不为null

blogsIndex.blade.php blogController.php 型号:Blog.php 型号:User.php 路线:Web.php TABLE详细信息:有两个表一个是通常的“用户”表。 并且“students_blog”的列名为“stu
2回复

我尝试在 Laravel 上使用 postgresql 但找不到驱动程序(SQL:从“用户”中选择 * 其中“id”= 4 limit 1)

工匠们好,我有一个 PostgreSql 问题,我有一个应用程序,我正在使用 MySql 并且一切正常,但我必须使用另一个数据库 PostgresSql,我做了必要的连接并运行了php artisan migrate ,迁移运行没有错误并且创建了表,但是当我尝试注册新用户时,出现此错误。 我已经清
4回复

SELECT * FROM Table Where ID

我正在尝试根据用户在我的URL中键入的ID从数据库中检索信息。 例如:如果USER A转到www.exampleurl.com/index.php?id=1,它将回显ID为1的用户信息。如果id为2、3等,则同样。他们的信息是通过另一个提交文件中的表单提交的。 这是我的代码,用于根据
5回复

PHP和MYSQL:从id = $ id选择

因此,我正在创建一个用户组功能,该功能使我可以阻止较低级别的用户访问页面。 这是我获取信息的功能: 就在这儿: 是哪里出了问题。 这是我获取信息的方法: 基本上,它只是一直给我“由于某种原因而导致查询错误,这会处理您的查询错误”,我被困住了。 php的新手,如果太乱
2回复

MySQL WHERE IN(…中的SELECT ID)最快的方法?

我正在使用这样的查询: 来搜索具有相同标签的视频,但搜索到大约8000个视频时,此查询的速度太慢。 如何使此查询更快? 也许JOIN更快? 像select * from videos_tags左加入(videos_tags.video_id = videos.id)上的视频,其中v
4回复

从数据库中的字段中选择ID

我有一个新闻数据库,我在每个新闻中都使用多只猫,所以我在一个名为cats的数据库中归档了文件,然后在其中插入数据,例如1,5,8,2这些数据就是cats id。 我用这段代码从数据库中选择猫 我想从数据库中选择新闻,其中猫中的$id_newscats归档在新闻表中,因此我遍历了此代
5回复

从id与$ id不同的mysql中选择

我在php中有几个不同的$id variable. 例如$id=3 ,然后在$id=4 ,在$id=5 ...` 我想要的是 我要选择与3或4或5不同的ID
2回复

从用户(表)获取数据,其中用户(表)的ID等于朋友(表)的ID

如果2个表的ID彼此相等,则尝试从一个表中获取数据。 这是我使用的代码: 我使用LEFT JOIN来联接两个表,但是它是从friends(表)而不是users(表)中获取值的。 我想我已经清楚地解释了我的问题。