2011-03-13 7 views
2

저는 상원과 하원의 검색 가능한 데이터베이스가 있으며이 데이터베이스를 검색 할 수있는 간단한 웹 페이지를 만들고 싶습니다. 유일한 문제는 SQL select 문을 쓰는 것이 편하지만 PHP에서 사용할 수 있도록 SQL 문을 올바르게 형식화하는 방법입니다.PHP에서 기본 SQL Select 문 형식 지정

는 예를 들어, 다음은 국가에 의해 상원 의원을 선택 내 라디오 버튼의 :

$sql = ""; 
if ($_POST['pkChamber'] == "Senate") { 
    if ($_POST['pkParty'] == "Y") { 
     $sql = SELECT * FROM senateinfo 
       WHERE state = (Variable = "stname") 
       ORDER BY last_name, first_name'); 
    } 
    else 
    { 
     $sql = SELECT * FROM senateinfo 
       WHERE state = (Variable = "stname") 
       ORDER BY last_name, first_name 
    } 
} 
+0

여기 초보자에게 질문하는 것이 좋습니다. 그러나, 나는 당신의 질문을 올바르게 가지고 있는지 잘 모르겠다. PHP 구문 또는 visul 형식에 관한 것입니까? –

+0

혼란을 드려 죄송합니다. PHP 구문에서 mySQL 쿼리를 올바르게 구문 처리하는 방법에 관한 것입니다. –

답변

1

한 번에 한 가지 문제에만 집중해야합니다.

PHP에서 문자열을 명확하게 처리하고 해당 문자열에 변수를 삽입하는 방법을 알기 전까지는 PHP를 사용하지 마십시오. 그래서 :

PHP에서 인용 문자열 (따옴표 대 따옴표, 그래, 히어 닥)에 최대 읽기

그것은 $ 달러가없는 경우 있음을 PHP (주에서 문자열 변수에 최대 읽기

기호, 그것은 문자열 변수가 아닌 상수입니다. $ 문자열과 $ 변수는 사용하지 않으면 안되는 상수에서 시작합니다. 상수가 아니라 다른 문자열을 사용할 수있게되면 문자열로 변환됩니다.

PHP에서 바인딩 SQL에 대해 읽어보십시오. 다른 것은 SQL injection 경로로 안내합니다.PHP SQL에 사용 된 나체 문자열 만있는 경우 웹 스크립트를 최종적으로 가혹하고 용납 할 수없는 인터넷에 배포 할 때 실패에 대비해야합니다. SQL 인젝션 경향이있는 스크립트를 이용할 준비가 된 상어로 가득합니다.

query("select * where someTable where someTable_id = :bound_id", array(':bound_id'=>13)); 

가 나중에 단순히 같은 바운드 SQL을 만들기위한 당신에게 기능을 얻을 수 있습니다 (다음은

쉽게 그것을 만드는 사용자 정의 기능을 중심으로 제가 SQL을 결합 매일 사용하는 코드의 예입니다 나는 실제로 당신이 관심이 있다면 모바일 대신 컴퓨터에 있어요.)

0

나는 항상이 같은 광산을이 좋은 찾고 유지.

$sql = "SELECT * FROM senateinfo " . 
     "WHERE state = (Variable = "stname") " . 
     "ORDER BY last_name, first_name')"; 
+0

정말 고마워요. 그러나 변수 선택''코드'''.stname ' "''을 적절히 쓰는 방법은 무엇입니까? –

+0

미안하지만, 나는 그것을 놓쳤다. 당신은 'stname'처럼 보일 수 있도록 하나의 '를 사용할 것입니다. 작은 따옴표를 사용할 때 문자열은 리터럴입니다. 큰 따옴표는 변수를 읽습니다. 설명서를 참조하십시오. http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.single – Drewdin

+1

상수! = $ 문자열. -1 – Kzqai

1

내가 아닌 사소한 쿼리를 작성하기위한 HEREDOC S를 사용

$sql = <<<EOL 
SELECT blah, blah, blah 
FROM table 
WHERE (somefield = {$escaped_value}) ... 
ORDER BY ... 
HAVING ... 
EOL; 

Heredocs 정기적 이중 인용 된 문자열을 수행하지만, 내부 탈출 가지고 있지의 보너스 것처럼 기능 인용 부호. 변수 보간이 예상대로 작동하므로 텍스트에 들여 쓰기를 수행 할 수 있으므로 쿼리가 멋지게 표시됩니다.

2

쿼리가 정상적으로 처리되었습니다. 필자는 PHP에서 문자열 분석의 미세한 부분을 이해할 필요가 있다고 생각합니다.

당신이 문자열을 둘러싸는 큰 따옴표 (")를 사용하는 경우, PHP 실제로 먼저 처리하는 변수 및/또는 기타 PHP 코드를 찾고 그것을 구문 분석을 이런 식으로 뭔가하려고합니다.

$sql = "SELECT * FROM table WHERE state = '{$state}' AND user = {$user->id}"; 

PHP를 것 해당 변수에 정의 된 모든 것을 $ state로 대체하고 해당 클래스에서 사용자가 인스턴스화 한 ID에 대해 동일하게 바꿉니다 (또한 {}에 간단한 변수를 래핑 할 필요가 없습니다.) 가독성에 도움이되지만 클래스 메서드/변수에만 필요)

작은 따옴표 (')를 사용하여 문자열을 묶는 경우 PHP는 정상적으로 처리합니다. 이 쿼리에서 나중에 변수를 사용하려면

$sql = 'SELECT * FROM senateinfo WHERE state = (Variable = "stname") ORDER BY last_name, first_name)'; 

하면, 다음과 같이 거기에있는 큰 따옴표를 이스케이프해야합니다 : 당신의 위의 쿼리는이 같은 단일 따옴표로 둘러싸 제안 :

$sql = "SELECT * FROM senateinfo WHERE state = (Variable = \"stname\") ORDER BY last_name, first_name)"; 

이렇게하면 PHP가 쿼리를 붙여 넣을 때 문자열을 잘못 연결하려고했다는 생각으로 PHP에서 오류가 발생하지 않습니다.

+2

죄송합니다. 그러나 완전히 이스케이프 처리되지 않은 SQL과 관련된 모든 대답은 기껏해야 불완전합니다. – Kzqai

+0

OP가 그걸 결정해야한다고 생각합니다 ... –

3

는 당신이 요구하는지 확실하지 않다, 그러나 나는 동적으로 WHERE 문을 구축하기위한 신뢰할 수 있고 안전한 방법의 좋은 예를 가지고 :

$w  = array(); 
$where = ''; 

if (!empty($_GET['rooms']))  $w[]="rooms='".mysql_real_escape_string($_GET['rooms'])."'"; 
if (!empty($_GET['space']))  $w[]="space='".mysql_real_escape_string($_GET['space'])."'"; 
if (!empty($_GET['max_price'])) $w[]="price < '".mysql_real_escape_string($_GET['max_price'])."'"; 

if (count($w)) $where = "WHERE ".implode(' AND ',$w); 
$query = "select * from table $where"; 

희망이 도움이됩니다.