【问题标题】:Sqlite3 search with PDO使用 PDO 进行 Sqlite3 搜索
【发布时间】:2021-07-12 02:25:58
【问题描述】:

我无法让 SQLite LIKE 搜索与 PDO 一起使用。这适用于 MySQL 和 MariaDB,但我无法让它与 SQLite3 一起使用。 我也尝试过来自互联网的不同示例。

我在 Linux 5.9 上使用 sqlite3 版本 3.35.3 和 PHP 8.0.3 版本。

echo '<pre>';

$createTable = <<<EOT
    CREATE TABLE users (
        id INTEGER PRIMARY KEY,
        name TEXT NOT NULL  
    );

    INSERT INTO users(name) VALUES 
    ('alpha'),
    ('beta'),
    ('gamma'),
    ('theta');
EOT;


if (!file_exists(__DIR__ . '/test.db'))
{    
    echo "#CREATING DB# <br>";    
    $pdo = new \PDO('sqlite:' . __DIR__ . '/test.db');
    $pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); 
    $pdo->exec($createTable);
    
    $term = 'et';        
    $sql = " SELECT * FROM users WHERE name LIKE :term ";    
    $stmt = $pdo->prepare($sql);
    $prepare = [
        'term' => "'%". $term ."%'"  
    ];        
    echo getPdoCompiledSqlString($sql, $prepare) . '<br>';
    
    if($stmt)
    {
        $stmt->execute($prepare);
        //$stmt->debugDumpParams();
        debugPdo($stmt);
        echo "#FETCHALL# <br>";
        print_r( $stmt->fetchAll() );            
    }
}
else
{
    echo "#DELETING DB#";
    unlink(__DIR__ . '/test.db');
}


function getPdoCompiledSqlString($sql, $params){
    echo "#SQL STRING# <br>";
    $keys = [];
    foreach ($params as $key => $value){ if (is_string($key)) {$keys[] = '/:'.$key.'/';} else {$keys[] = '/[?]/';}}
    return preg_replace($keys, $params, $sql, 1, $count);
}

function debugPdo(&$stmt){    
    echo "#DEBUG PDO OBJ# <br>";
    $stmt->debugDumpParams();
}



echo '<pre>';

【问题讨论】:

  • $pdo-&gt;exec($createTable); 你有 2 个语句。也许您一次只能运行一个语句?尝试分别exec()他们。
  • @KIKOSoftware exec() 能够执行多个语句。
  • @Syscall OK。是的,报价才是真正的问题。

标签: php sqlite pdo


【解决方案1】:

你不需要引用参数:

'term' => "%". $term ."%"

代替

'term' => "'%". $term ."%'"

因为execute()期间会自动引用参数

$term = 'et';
$sql = " SELECT * FROM users WHERE name LIKE :term ";
$stmt = $pdo->prepare($sql);
$prepare = [
    'term' => "%". $term ."%" //only the search string: `%et%`
];
$stmt->execute($prepare);
print_r($stmt->fetchAll());

输出:

Array
(
    [0] => Array
        (
            [id] => 2
            [0] => 2
            [name] => beta
            [1] => beta
        )
    [1] => Array
        (
            [id] => 4
            [0] => 4
            [name] => theta
            [1] => theta
        )
)

【讨论】:

  • 啊,我明白了。谢谢。
猜你喜欢
  • 2011-03-21
  • 1970-01-01
  • 2015-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-24
  • 1970-01-01
  • 2011-08-09
相关资源
最近更新 更多