Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用SQLite_bind_text将文本适当地绑定到SQLite准备的语句_Sql_Sqlite - Fatal编程技术网

如何使用SQLite_bind_text将文本适当地绑定到SQLite准备的语句

如何使用SQLite_bind_text将文本适当地绑定到SQLite准备的语句,sql,sqlite,Sql,Sqlite,如果使用sqlite3\u prepare\u v2运行以下SQL,它将生成预期结果 select id, path, name from media where id in ( select media_id from media_tags where tag_id in ( select id from tags where name in ( 'name_1', 'name_2', 'name_5', 'name_8',

如果使用
sqlite3\u prepare\u v2
运行以下SQL,它将生成预期结果

select id, path, name
from media
where id in (
    select media_id
    from media_tags
    where tag_id in (
       select id 
       from tags
       where name in ( 'name_1', 'name_2', 'name_5', 'name_8', 'name_43' ) )
    group by media_id
    having count( media_id ) = 5 );
但是如果改成

select id, path, name
from media
where id in (
    select media_id
    from media_tags
    where tag_id in (
       select id 
       from tags
       where name in ( ? ) )
    group by media_id
    having count( media_id ) = ? );
sqlite3\u bind\u text(stmt,1,char\u ptr,-1,SQLITE\u STATIC)
使用了
sqlite3\u bind\u int(stmt,2,5)
,没有返回结果,也没有错误

如果子句名称中的
是硬编码的,并且只有媒体id计数5设置为
sqlite3\u bind\u int
,则返回预期结果

硬编码5并尝试使用
sqlite3\u bind\u text
绑定名称不会返回结果

在所有情况下,语句都已成功准备,至少在该步骤中不会生成错误代码

如果字符ptr打印到屏幕上,则它是
“名称1”、“名称2”、“名称5”、“名称8”、“名称43”

我一定是误解了一些简单的事情。你能告诉我遗漏了什么吗

多谢各位



我也在SQLite论坛上发布了这个问题,并收到了一个关于什么可能是一个相对新的特性的回复,该特性允许在
中的
集合中使用一个
,这似乎表明,即使集合中的元素数量可变,也可以在编译时准备好准备好的语句。它被称为
carray数组扩展函数
。我还没有试过,但我想最好现在就试一下,以防以后忘记。

试着用一个?每个绑定变量,如中所示:

where name in (?, ?, ?, ?, ?)

然后分别调用sqlite3\u bind\u text。

哦,我一点也没想到,谢谢。我会尝试一下。有时您会在运行时生成sql查询本身和匹配的bind语句。谢谢。这似乎奏效了。所需标签的数量和名称会有所不同;因此,存储准备好的语句似乎没有什么好处,因为每次请求时都必须重新准备。也可以只在SQL查询文本本身中包含名称和数字,而不使用问号和绑定语句。在SQLite论坛上的一篇帖子中,回复描述了
Carray
方法,该方法可以接受
中的
中的单个
。我在原来问题的末尾加了一句。我还没有试过,但我认为它需要从本月3.34开始的最新版本的SQLite。