2011-12-16 3 views
0

전체 게시 배열을 가져와 각 값을 이전 값을 업데이트 할 select 문에 넣으려고합니다. 문자열 이스케이프를 사용하여 PHP에서이 작업을 수행하는 데 문제가 있습니다.PHP SQL 문 형성

UPDATE test1l.testtable SET age=106, weight=345, WHERE id=11 

그래서 제출 페이지가 먼저 변수에 $ _POST 배열을두고 :

내가 통과하려고 SQL 문입니다. 그런 다음 각 게시물 변수가 올바른 위치에 있도록 문을 설정하려고합니다.

$dataArray = $_POST; 
$Sql =" UPDATE test1l.testtable SET age=$dataArray['age'],weight=$dataArray['weight'] WHERE id=$dataArray['id']" 

작은 따옴표와 큰 따옴표로 인해 내 진술이 엉망입니다. 또한, 나는 이러한 문자열을 이스케이프 주입을 막을 수 있도록 이스케이프 사용자 지정 기능이 있습니다.

+2

'UPDATE test1l.testtable SET age = 106, weight = 345 WHERE id = 11' –

+0

PHP 문자열에 넣는 데 문제가 있습니다. 따옴표를 어디에 넣어야하는지. 그건 그냥 복사 파스타 오류였습니다 – lodkkx

+0

"주입을 막을 수 있도록 문자를 이스케이프 처리하는 사용자 정의 기능이 있습니다." 왜 사용자 정의 함수를 사용해야합니까? 이미이 작업을 수행하는 기능이 내장되어 있습니다. –

답변

2

를 사용하여 연결 :

'update ... SET age = ' . $dataArray['age'] . ', weight = ...' 

을 알지 못하는 당신, 당신은 괄호 내부에서 진드기를 제거 할 수 있습니다 단지 넣다

$query = sprintf("UPDATE test1l.testtable SET age='%s', weight='%s' WHERE id='%s'", $age, $weight, $id); 
1

알 수없는 입력에 대해 확인 된 사용자 입력 (mysql_real_escape_string)을 변수에 저장하고 다음과 같이 sprintf을 사용하십시오. 변수의 일부가 정의되지 않았거나 데이터베이스 정보가 올바르지 않은 경우를 제외하고는이 코드 행이 중단되지 않습니다. $dataArray[age]

+0

그게 내가 필요한 / – lodkkx

0

내가이

$mysqli->query("UPDATE test1l.testtable SET age='".$dataArray['age']."', 
      weight='".$dataArray['weight']."' WHERE id='".$dataArray['id']."' ") 

처럼 할 SQL을 피하기 위해 게시물 속성을 검증하고 적절히 이스케이프해야합니다. 이온. 또는 더 나은 방법 : 확실한 준비된 진술을 사용하십시오. 참조이 같은 http://php.net/manual/fr/mysqli.prepare.php

1

뭔가 더 안전 할 것 :

$dataArray = $_POST; 
$Sql =" UPDATE test1l.testtable SET age=?, weight=? WHERE id=?"; 
$Statement = $mysqli->prepare($Sql); 
$Statement->bind_param('iii', $dataArray['age'], 
           $dataArray['weight'], 
           $dataArray['id']); 
$Statement->execute(); 
1

이 같은 형식으로가는 경우 :

$Sql =" UPDATE test1l.testtable SET age=$dataArray['age'],weight=$dataArray['weight'] WHERE id=$dataArray['id']" 
이 이

그것은 다음과 같이 수행해야합니다 :

$Sql ="UPDATE test1l.testtable SET age={$dataArray['age']},weight={$dataArray['weight']} WHERE id={$dataArray['id']}"; 

double 내부에서 작업 할 때는 배열 및 객체와 같은 복잡한 변수를 {}로 묶어야합니다. 인용 부호. 또한

$string = "print {$object->param} and {$array['key']}"; 

쿼리는 모든 정수 필드에 대해 다루고 있습니다 잊지 마세요 - 당신이 VARCHAR, 문자, 텍스트와 같은 DB에 문자열 필드에 도착하면 - 당신이있는 거 쿼리는 다음과 같이 작은 따옴표로 이러한 묶어야합니다 : 매개 변수화 진술 또는 함수는 mysql_real_escape_string를 사용한다하여 SQL 한 Statment의 일부를위한 사용자 입력에 기초하여 임의의 변수를 언급 로서도

$Sql ="UPDATE test1l.textfield SET textfield='{$dataArray['age']}' WHERE id={$dataArray['id']}"; 

.

$sql= 'UPDATE test1l.testtable SET age='.mysql_real_escape_string($dataArray['age']).', weight='.mysql_real_escape_string($dataArray['weight']).' WHERE id='.mysql_real_escape_string($dataArray['id']); 

을 그리고 이상적으로는 mysql_real_escape_string와 데이터베이스를위한 모든 필드를 살균 할 재사용 가능한 기능으로이 추출 것 : 당신이 더 많은 같은 문자열 건물 형식으로 변경해야합니다 경우

은 참고로이입니다 그래서 당신은 그런 못생긴/읽을 수없는 SQL 문자열을 계속 만들 필요가 없습니다.