将PHP PDO迁移到Laravel PDO会导致参数号无效

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将PHP PDO迁移到Laravel PDO会导致参数号无效相关的知识,希望对你有一定的参考价值。

我正在将php PDO实例转换为Laravel 5.5。我改变了/到的数据库连接:

//$dbc = new PDO ('mysql:host='. $DB_HOST .';dbname='. $DB_NAME, $DB_USER, $DB_PASS);
$dbc = IlluminateSupportFacadesDB::connection('foobardb')->getPdo();

出于某种原因,这导致我的SELECT查询失败。

$query = "SELECT *
          FROM foobartable
          WHERE date_created > :sunday
          AND date_created <= :monday
          AND date_updated > :sunday
          AND date_updated <= :monday";

$stmt = $dbc->prepare($query);
$stmt->bindValue(':monday', $monday, PDO::PARAM_STR);
$stmt->bindValue(':sunday', $sunday, PDO::PARAM_STR);
$stmt->execute();

$results = $stmt->fetchAll(PDO::FETCH_ASSOC);

根据堆栈跟踪,错误是在$stmt->execute();上专门触发的

SQLSTATE [HY093]:参数号无效

我显然有correct parameters,这可以很好地使用PHP的PDO实例,所以为什么它不适用于Laravel?

答案

由于某种原因,Laravel连接不会自动使用PDO::ATTR_EMULATE_PREPARES。即使是mysql连接。只需在连接数组中添加选项即可解决此问题。

'foobardb' => [
    'driver'    => 'mysql',
    'host'      => env('DB_HOST', 'localhost'),
    'port'      => env('DB_PORT', 3306),
    'database'  => 'foobardb',
    'username'  => env('DB_USERNAME', 'forge'),
    'password'  => env('DB_PASSWORD', ''),
    'charset'   => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix'    => '',
    'strict'    => false,
    'engine'    => null,
    //add addition options here
    'options'   => [PDO::ATTR_EMULATE_PREPARES => true]
],

我不知道这是否仅限于Laravel 5.5,或者是否需要在早期版本中添加该选项。

解决此问题的另一种方法是执行以下操作:

$query = "SELECT *
          FROM foobartable
          WHERE date_created > :sunday
          AND date_created <= :monday
          AND date_updated > :sunday2
          AND date_updated <= :monday2";

然后:

$stmt->bindValue(':monday', $monday, PDO::PARAM_STR);
$stmt->bindValue(':sunday', $sunday, PDO::PARAM_STR);
$stmt->bindValue(':monday2', $monday, PDO::PARAM_STR);
$stmt->bindValue(':sunday2', $sunday, PDO::PARAM_STR);

因此它认为你拥有与拥有bindValues相同数量的PDO令牌。

以上是关于将PHP PDO迁移到Laravel PDO会导致参数号无效的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:PHP Artisan Migrate 抛出 PDO 异常:找不到驱动程序(Postgres)

php artisan migrate throwing [PDO Exception] 找不到驱动程序 - 使用 Laravel

在 xampp 中从 5.6 迁移 PHP 7 时,PDO 驱动程序在 Windows 中没有价值

Apache,PHP,MySQL,PDO,权限被拒绝,laravel

SQLSTATE[HY000] [2002] 权限被拒绝 Laravel PDO 驱动程序(凭证通过工匠迁移工作)

如何在Laravel中修复PDO sqlsrv连接超时?