2014-06-18 3 views
0

my mysql 테이블은 많은 필드에서 NULL 값을 허용하며 레코드를 업데이트하고 데스크탑 응용 프로그램은 다음과 같이 http 문자열을 작성하고 PHP 스크립트로 보냅니다. DB를 thirdval에mysqli 매개 변수의 null 값

www.webpage/script.php?firstval=48.345345&secondval=234&thirdval=&fourthval=simon 

이미 NULL하지만 HTTP 문자열의 매개 변수 또는 값

을 보유하지 않을 수있다

내가해야합니까 : B로 HTTP 문자열의 매개 변수를 전달 A)) 모든 에서 HTTP 문자열 매개 변수 또는 다른 뭔가를 포함하지 않음)) C로 httpstring의 매개 변수를 전달 PHP 스크립트 ( D에 null 값에 대한 수용 내 phpscript 그렇게 같다 :

?php 

DEFINE ('DBUSER', 'generic01'); 
DEFINE ('DBPW', 'genpass'); 
DEFINE ('DBHOST', 'mysql4.xxxxxxxxx.com'); 
DEFINE ('DBNAME', '_Places'); 


$dbc = mysqli_connect(DBHOST,DBUSER,DBPW); 
if (!$dbc) { 
die("Database connection failed: " . mysqli_error($dbc)); 
exit(); 
} 

$dbs = mysqli_select_db($dbc, DBNAME); 
if (!$dbs) { 
die(" Database selection bit failed: " . mysqli_error($dbc)); 
exit(); 
} 
$lat = mysqli_real_escape_string($dbc, $_GET['lat']); 
$lng = mysqli_real_escape_string($dbc,$_GET['lng']); 
$prox = mysqli_real_escape_string($dbc,$_GET['prox']); 
$description = mysqli_real_escape_string($dbc,$_GET['description']); 
$id = mysqli_real_escape_string($dbc,$_GET['id']); 
$direction = mysqli_real_escape_string($dbc,$_GET['direction']); 
$avoiddays = mysqli_real_escape_string($dbc,$_GET['avoiddays']); 
$validfrom = mysqli_real_escape_string($dbc,$_GET['validfrom']); 
$validto = mysqli_real_escape_string($dbc,$_GET['validto']); 
$gefid = mysqli_real_escape_string($dbc,$_GET['gefid']); 
$expiry = mysqli_real_escape_string($dbc,$_GET['expiry']); 


$query = "UPDATE places SET rt_lat = '$lat',rt_lng= '$lng',rt_prox = '$prox', rt_description = '$description', rt_direction = '$direction',rt_avoiddays = '$avoiddays',rt_validto = '$validto',rt_validfrom = '$validfrom',rt_gefid = '$gefid',rt_expiry='$expiry' WHERE rt_id = '$id'"; 

$result = mysqli_query($dbc, $query) or trigger_error("Query MySQL Error: " . mysqli_error($dbc)); 


mysqli_close($dbc); 
?> 

감사 모든 도움,

+1

, 당신이 그것을에 값을 제공하지 않는 한이 널 (null)로 기록됩니다. 이것은 자동으로 발생합니다. – durbnpoisn

+0

^쿼리 자체를 다시 작성해야 할 필요가 있습니다. 전체 필드 할당을 NULL로 지정하는 대신 아웃으로 지정해야합니다. – CD001

+0

CD001, 예, 문제가 있습니다. http 문자열을 조작해야합니다. 최종 매개 변수 뒤에 '&'가 필요할 수도 있고하지 않을 수도있는 과제를 포함하거나 제외 할 수 있습니다. –

답변

0

http 요청에 포함 할 필요는 없지만이를 잡아야합니다. 그렇지 않으면 E_NOTICE 오류가 발생합니다. null이 될 수있는 모든 분야에 대한

: 필드가 널 (null)을 허용하도록 설정되어있는 경우

if (isset($_GET['gefid'])) { 
    $gefid = mysqli_real_escape_string($dbc,$_GET['gefid']); 
} else { 
    $gefid = null; 
} 
0

PHP는 SQL의 널 (null)에 대한 지식이 없습니다. 당신이 빈 /하지-설정 $ _GET 값이 DB에 null이되고 싶은 경우에, 당신은 특별한 조치를 취할 필요가 :

if(isset($_GET['lat']) || ($_GET['lat'] == '')) { 
    $lat = 'NULL'; // a plain PHP string with the word "null" in it 
} else { 
    $lat = "'" . mysqli_real_escape_string($dbc, $_GET['lat']) . "'"; // note the extra quotes 
} 

$sql = "INSERT ... VALUES ($lat, ....)" 

당신이 그것을 다른 방법으로 할 경우, 예를 들어, (단지 예로서,

$sql = "INSERT ... VALUES ('$_GET[lat]', ...)"; 

그런 다음 빈 $_GET['lat'] 쿼리에 대해 실제로

INSERT ... VALUES ('', ...) 

것 당신이 빈 문자열이 아닌 SQL 널 (null)을 삽입 할 것 : 네, 그것은 취약한 SQL 인젝션)입니다.

+0

Marc, 나는 단지 길이가 0보다 큰 경우 할당을 추가하는 코드를 작성 했으므로 이제는 유효한 할당을 전송하지만 if를 추가 했음에도 불구하고 (isset ($ _ GET [ 'gefid ']) || ($ _GET ['gefid '] ==' ')) { $ gefid ='NULL '; // 단어 "null"이 포함 된 일반 PHP 문자열 } else { $ gefid = " '". mysqli_real_escape_string ($ dbc, $ _GET [ 'gefid']). " '"; // 여분의 인용문을 참고하십시오. } 데이터베이스는 NULL 대신 0을 보여줍니다. 그러나 동일한 필드에 NULL 값을 포함하는 다른 오래된 행이 있습니까? –

관련 문제