ryoakg
7/20/2016 - 10:22 AM

SQL の in で プレイスホルダー を使う方法. php以外にも応用できるかも

SQL の in で プレイスホルダー を使う方法. php以外にも応用できるかも

<?php
if (PHP_SAPI !== 'cli') throw new Exception(PHP_SAPI . ' is not supported SAPI.');

$pdo = new PDO('sqlite:test.db');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);


/** setup **/
$pdo->beginTransaction();

// delete data every time to restart from clean environment.
$pdo->prepare("DROP TABLE IF EXISTS test")->execute();
$pdo->prepare("
CREATE TABLE test (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT
)")->execute();

// insert arbittary data
foreach(range('a','z') as $ch)
    $pdo->prepare("INSERT INTO test (name) values (?)")
        ->execute(array('name_'.$ch));

$pdo->commit();


/** main issue **/
$ids = [4,3,20,13];
$sql0 =<<<EOS
SELECT *
  FROM test
 WHERE id IN (%s)
EOS;
// fill placeholder '?'s
$stms = $pdo->prepare(sprintf($sql0, join(',', array_fill(0,count($ids),'?'))));
$stms->execute($ids);
var_dump($stms->fetchAll());