在'IN(.....)'子句的查询中使用预准备语句?

Evi*_*t7x 4 php pdo

是否有(棘手/非标准)的方式来做到这一点?

会是这样的

$stmt = $db->prepare( 'SELECT title FROM episode WHERE id IN (?, ?, ?, ?);
Run Code Online (Sandbox Code Playgroud)

工作?因此,如果我想搜索可变数量的ID,我能做到吗?

$ids = array(1,2,3,4,5,6,7);
$idSection = implode(array_pad(array(), count($ids), '?')) //To give ?,?,?,?,?,?,?
$stmt = $db->prepare( 'SELECT title FROM episode WHERE id IN ($idSection);
$stmp->execute($ids);
Run Code Online (Sandbox Code Playgroud)

即使这样可行,但对于使用相同的预准备语句运行多组数据仍然没有用,除非$ids每次搜索的集合长度相同,并且它不适用于名称占位符.

如果你这样做,我假设

$stmt = $db->prepare( 'SELECT title FROM episode WHERE id IN (:ids);
$ids = implode('","' array(1,2,3,4,5,6,7));
$stmt->bindParam( ':ids', $ids);
Run Code Online (Sandbox Code Playgroud)

它失败是因为准备好的语句被构造成它将搜索单个id值并且"1","2","3","4","5","6","7"将不匹配?

我确信有一个更好的答案,而不仅仅是不使用IN(...)条款.我是否只需$ids手动清理该术语并将其包含在没有占位符的查询中?

$stmt = $db->prepare( "SELECT title FROM episode WHERE id IN $ids AND genre like :genre");
$stmt->bindParam( ':genre', '%$genre%);
Run Code Online (Sandbox Code Playgroud)

Ale*_*233 10

MySql有一个FIND_IN_SET函数,您可以使用它来实现相同的结果:

$ids = array(1,2,3,4,5,6,7);
$stmt = $db->prepare( 'SELECT title FROM episode WHERE FIND_IN_SET(id,?)' );
$param = implode(',',$ids);
$stmt->bind_param('s',$param); 
$stmt->execute(); 
Run Code Online (Sandbox Code Playgroud)