2014-04-21 2 views
0

PHP/PDO 사용 "flt_status"라는 MySQL (mysql-5.0.96) 변수를 설정하려고합니다. 기본값은 'NULL'로 설정되어 있으며 INT로 정의되어 있습니다 (5), nullable, NULL로.PHP/PDO를 사용하여 NULL 값 설정

이 주제를 다루는 StackOverFlow (11692773, 1391777)에는 많은 스레드가 있지만 아무 것도 작동하지 않는 것 같습니다.

내 (매우 약식) 코드는 다음과 같습니다.

$vs = “:ip, flt_status, sunrise”; 

$match = array( 
‘:ip’=>”$ip”, 
‘:flt_status’=>”null, PDO::PARAM_INT”, 
’:sunrise’=>”$sunrise” 
); 

$vars = “ip, flt_status, sunrise”; 

$sql = "INSERT INTO skeds ($vars) VALUES ($vs)"; 

$query = $db_found->prepare($sql); 

$query->execute( $match); 

은 내가 구글하지만 flt_status의 값이 0으로 나오는 모든 시간을 사용하여 발견 한 위의 토론과 다른 사람에 설명 된 기술의 숫자를 시도했습니다 (0). 나는 PDO :: PARAM_NULL과 PDO :: PARAM_INT를 사용하여 시도했다.

IP 및 SUNRISE 변수를이 예제에 포함 시켰으므로 PHP/PDO 프로그래머가 저에게 줄 수있는 예제를 더 잘 이해할 수 있습니다.

누군가 내가 잘못하고있는 것을 보여줄 수 있습니까?

미리 도움을 주셔서 감사합니다.

+0

은' "'당신은 그'있으며, heere을 제공하는 샘플 코드에 사용했다" '(큰 따옴표) 또는 뭔가 다른 –

+0

I? 개인적으로 내가 쿼리의 필드에 NULL을 할당 할 경우 따옴표로 묶을 수 없거나 문자열로 설정된다는 것을 알아 채 셨습니다. 필드 = NULL은 나를 위해 작동하는 경향이 있습니다 – dsimer

답변

2

$vs = “:ip, flt_status, sunrise”; 

먼저 똑 바른 따옴표 대신에 스마트 따옴표를 사용하고있는 것 같습니다. 코드에는 직선 따옴표가 필요합니다.

다음으로 : 접두사를 ip 앞에 넣었지만 다른 두 개의 명명 된 매개 변수보다 먼저 접두사를 놓친 경우입니다. 각의 앞에 :, 이 필요합니다.

$match = array( 
‘:ip’=>”$ip”, 
‘:flt_status’=>”null, PDO::PARAM_INT”, 
’:sunrise’=>”$sunrise” 
); 

다음으로 null을 인용 문자열에 넣습니다. 즉, null이 아닌 'null'이라는 단어가 포함 된 문자열 리터럴이됩니다. 이 두 가지 개념은 다르다. 예를 들어 닭고기와 종이 조각에 "닭고기"라는 단어가 쓰여진 것과 같다.

또한 변수 주위에 따옴표를 사용할 필요가 없습니다.

또한 가치있는 내용은 배열의 배열 키에 : 접두사가 붙는 것이 선택 사항입니다. 초기 버전의 PDO에서는 필수 항목 이었지만 지금은 그렇지 않습니다. 콜론 접두사를 유지하는 데 아무런 해가 없습니다. $ _POST와 같은 다른 연관 배열에서 매개 변수 배열을 쉽게 준비 할 수 있기 때문에 알려 드리고 싶습니다.

$vars = “ip, flt_status, sunrise”; 

스마트 쿼트를 계속 사용하는 경우를 제외하고는 괜찮습니다. 이 두 개의 일반 컬럼 이름 다음에 하나의 매개 변수 자리 표시를 포함하고 있기 때문에 당신이 당신의 $vs에 문제 들어갈 곳 여기

$sql = "INSERT INTO skeds ($vars) VALUES ($vs)"; 

입니다. VALUES 절에 열 이름을 전달하는 것은 SQL에서는 불법이 아니지만이를 수행하는 것은 의미가 없습니다.

$query = $db_found->prepare($sql); 
$query->execute( $match); 

그래, 오류를 확인하지 않는 것을 제외하고는. 예외를 throw하기 위해 PDO의 속성을 활성화하지 않은 경우, false을 반환하기 때문에 반환 상태는 prepare()execute()이므로 확인해야합니다. 이것은 PHP 개발자들 사이에서 가장 흔한 실수 중 하나입니다.


다음은이 코드를 작성하는 방법입니다.

PDO에 연결할 때 예외를 활성화하십시오. 참조

$db_found = new PDO(...); 
$db_found->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

http://php.net/manual/en/pdo.error-handling.php 다음의 코드이 루틴 :

$placeholders = ":ip, :flt_status, :sunrise"; 

$values = array( 
    'ip'   => $ip, 
    'flt_status' => null, 
    'sunrise' => $sunrise 
); 

$columns = "ip, flt_status, sunrise"; 

$sql = "INSERT INTO skeds ($columns) VALUES ($placeholders)"; 

$stmt = $db_found->prepare($sql); 

$stmt->execute($values); 
+0

스마트 쿼트가 발생했다고 생각합니다. 내가 사이트에 게시하기 전에 편집자에게 내 게시물을 입력하여. 모든 사람에 대해 미안하지만, 다시는 발생하지 않습니다. –

0

당신이 그 실제 문자열 "널 (null), PDO :: PARAM_INT"를 사용하는 것

$match = array( 
‘:ip’=>”$ip”, 
‘:flt_status’=>”null, PDO::PARAM_INT”, 
’:sunrise’=>”$sunrise” 
); 

말할 때. NULL을 원할 경우 자리 표시자를 PHP 값 null에 바인드하십시오.

0

문자열과 PHP 코드의 차이점을 이해해야합니다.

은 문자열입니다. 문자열에 PHP 코드를 저장할 수 없습니다.

다시

"null" 중 하나를 NULL 값이 아니라 문자열은 단순하게, 예.

당신이 널 (null)을 결합 하다며하려면

가, 그럼 그냥 PHP의 NULL 값을 바인딩 "널 단어가 포함되어 있습니다.

1

당신은 당신의 코드에서 몇 가지 실수가 이런 식을 조정 해보십시오. 당신이 잘못 몇 가지 일을하고있다

$sql = "INSERT INTO skeds (ip, flt_status, sunrise) VALUES (:ip, :flt_status, :sunrise)"; 
$query = $db_found->prepare($sql); 
$query->execute(array(':ip'=> $ip, 
         ':flt_status'=>null, 
         ':sunrise'=>$sunrise 
));