2012-07-04 3 views
4

다음 코드로 테이블을 업데이트하려고합니다. WHERE temp_booking_id = ':temp_booking_id'");을 실제 현재 세션 temp_id을 사용하도록 변경하면 쿼리가 실행되지만 자리 표시 자 (예 : 체크 아웃)가 값으로 추가됩니다.PDO 업데이트가 준비된 문에서 자리 표시자를 바꾸지 않음

$data은 올바른 값을 갖고 있지만 자리 표시자를 바꾸는 것은 아닙니다.

몇 시간 동안이 문제를 쳐다 보면서 나에게있어 문제가 무엇인지 알아 내고 해결책을 찾지 못했습니다. 어레이 ([0] => 00000)

및 I는 자리 주위에 인용 부호를 제거 할 경우는

를 반환

PDOStatement:errorInfo()

PDOStatement :: ERRORINFO()를 반환

PDOStatement :: ERRORINFO() 배열 ([0] => HY093)

아이디어가 있으십니까?

try { 
    $data = array(
    'temp_booking_id' => $_SESSION['temp_id'], 
    'check_in' => $in, 
    'check_out' => $out, 
    'adults' => $a, 
    'children1' => $c1, 
    'children2' => $c2, 
    'infants' => $i, 
    'cots' => $c, 
    'promo_code' => $pc 
); 

$STH = $DBH->prepare("UPDATE b_temp_booking 
    SET check_in = ':check_in', 
    check_out = ':check_out', 
    adults = ':adults', 
    children1 = ':children1', 
    children2 = ':children2', 
    infants = ':infants', 
    cots = ':cots', 
    promo_code = ':promo_code' 
    WHERE temp_booking_id = ':temp_booking_id'"); 

$STH->execute($data); 

echo "\nPDOStatement::errorInfo():\n"; 
$arr = $STH->errorInfo(); 
print_r($arr); 

} catch(PDOException $e) { 
    echo 'ERROR: ' . $e->getMessage(); 
} 
+0

마음에 든다면 따옴표로 묶어서 사용하지 않는 것이 좋은 이유가 있습니다. 그렇지 않으면 정적 쿼리를 사용하여 데이터베이스에': this_starts_with_a_colon' 문자열을 어떻게 얻을 수 있습니까? 'HY093'은 그 밖의 다른 것을 가리키고 있지만, 보통 코드뿐만 아니라 그 코드와 관련된 설명을 얻습니다 ..... 흠,'$ DBH-> setAttribute (PDO :: ATTR_EMULATE_PREPARES, false)'를 시도해 보셨습니까? – Wrikken

+0

오, 그게 도움이되지 않는다면,'$ STH-> debugDumpParams();는 무엇을 말합니까? – Wrikken

답변

4

흠, SQL 문에는 작은 따옴표가 필요하지 않은 것 같습니다. 예를 들어, 대신에이 블록을 실행 시도 할 수 있습니다 : PDO에 PHP 설명서

$STH = $DBH->prepare("UPDATE b_temp_booking 
    SET check_in = :check_in, 
    check_out = :check_out, 
    adults = :adults, 
    children1 = :children1, 
    children2 = :children2, 
    infants = :infants, 
    cots = :cots, 
    promo_code = :promo_code 
    WHERE temp_booking_id = :temp_booking_id"); 

체크 아웃 제표를 작성 : http://www.php.net/manual/en/pdo.prepared-statements.php 는 따옴표가 지정된 자리의 주위에 필요하지 않은 것을 여기처럼 보인다.

$STH->execute(); 

그것을 체크 아웃 : 당신이 실행할 준비가되면

$STH->bindParam(':temp_booking_id', $temp_booking_id); 

$temp_booking_id = $_SESSION['temp_id']; // Not sure how binding the environment variable will work, so decoupling it. 

$STH->bindParam(':check_in', $in); 
$STH->bindParam(':check_out', $out); 
$STH->bindParam(':adults', $a); 
$STH->bindParam(':children1', $c1); 
$STH->bindParam(':children2', $c2); 
$STH->bindParam(':infants', $i); 
$STH->bindParam(':cots', $c); 
$STH->bindParam(':promo_code', $pc); 

, 당신은 다음과 같은 줄을 실행할 수 있습니다 : 그들은 bindParam() 메소드를 사용하는 경우 또한

는 자신의 예를 다음 시도 매개 변수 바인딩이 당신이 찾고있는 것인지 확인하십시오.

+0

음 ... 나는 곤두박질 친다. 먼저 배열 대신 bindParam을 사용하여 처음부터 다시 작성하고 작동합니다! 그런 다음 BindParam을 배열로 바꿨습니다. 그러나 이전 쿼리에서 따옴표를 제거하면 새 쿼리와 겉보기에 일치하므로 오류가 발생합니다. 두 개의 겉으로보기에 동일한 코드 조각, 하나는 작동하지만 하나는 그렇지 않습니다. 이상한, 다른 뭔가가 있어야하지만, 나는 그것을 볼 수 있으면 저주받을거야. 어쨌든 도움 주셔서 감사합니다. – user1453391

+3

IIRC의 경우 배열 키는 쿼리의 자리 표시 자와 쌍을 이루기 전에 콜론을 포함해야합니다. 여기서 콜론이 잘못되었을 수 있습니다. – Bojangles

관련 문제