2017-12-19 10 views
1

PHP PDO 인스턴스를 Laravel 5.5로 변환 중입니다.PHP PDO를 Laravel PDO로 마이그레이션하면 매개 변수 번호가 잘못됨

//$dbc = new PDO ('mysql:host='. $DB_HOST .';dbname='. $DB_NAME, $DB_USER, $DB_PASS); 
$dbc = \Illuminate\Support\Facades\DB::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과 함께 작동하지 않는 이유는 무엇입니까?

+0

'date_updated? BETWEEN?을 사용하여 이런 종류의 질의를 단순화 할 수 있다는 것을 기억하십시오. 및? '를 사용하는 것이 좋습니다. – tadman

+1

그게 좋은 지적이야. 나는 종종 잊어 버린다. – amflare

+0

'BETWEEN'은 닫힌 경계를 사용하기 때문에'b와 b와 c 사이 어디'는'a> = b와 a <= c'로 변환됩니다. 이것이 구현하려는 규칙과 동일한 지 확인하려면 바운드 값 유형과 데이터베이스 필드 유형을 참조하여 경계가 올바르게 일치하는지 확인해야합니다 (예 : 날짜/날짜 시간/유닉스 타임 스탬프/등) –

답변

2

어떤 이유로 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 토큰의 같은 번호가 생각하는 것을

이 문제를 해결하는 또 다른 방법은 바로 그런 짓을하는 것입니다.

+0

'execute()'메소드에 연관 배열을 제공하여 여러 값을 한 번에 바인드 할 수도 있습니다. – tadman

+0

'PDO :: ATTR_EMULATE_PREPARES' 없이도 작동합니까? – amflare

+0

거기에 다른 것이 있다는 것을 나는 모른다. – tadman