2011-01-16 4 views
1

나는 여분의 눈 쌍이 필요합니다! 매우 간단한 검색어가 있습니다.변수가 삽입 될 때 mysqli 쿼리가 작동하지 않습니다.

$result = $mysqli->query("SELECT post_id FROM blog_posts WHERE post_uri = 'the-test-post' LIMIT 1"); 
$row = $result->fetch_array(); 

이 게시물 ID가 있습니다. 그러나 post_uri에 대한 변수를 삽입하면 결과는 비어 있습니다. 시도한 방법 중 아무도 작동하지 않았다 :

나는 다른 페이지에서 비슷한 쿼리를 사용하므로 더 혼란 스럽다. 도움말 감사. 당신이 문자열에 해당 쿼리를 넣고 그것을 에코 경우

+1

리터럴 인라이닝에 대한 저항은 아마도 매개 변수를 바인딩한다는 힌트 일뿐입니다. http://use-the-index-luke.com/sql/where-clause/bind-parameters?langtype=php#tab_4 –

+0

+ 1 좋은 리소스에 대한 – CodeVirtuoso

답변

3

당신은 쿼리에 직접 변수를 치고있다. 이것은 오류가 발생하기 쉽기 때문에 (당신이 발견 한 것처럼) 충분히 위험성이 없으므로 (따라서 SQL 주입 취약점이 발생할 수 있음) 높은 위험이 있습니다.

사용 the PDO layer and bound variables.

+0

이 매우 귀중한 정보 주셔서 감사합니다. – CodeVirtuoso

+0

내가 여기에 대해 물어 본 것보다 앞의 INSERT 쿼리에서 구문 누락으로 인해 오류가 발생했다.이 누락은 여기에 제안 된 접근 방법을 사용할 때도 발생할 가능성이 없다. 게다가 더 안전합니다. 정말 고마워! – CodeVirtuoso

2

, 당신은 어떻게되는지 확인할 수 있습니다. 변수에 문제가있을 수 있습니다!

echo "SELECT post_id FROM blog_posts WHERE post_uri = '".$post_uri."' LIMIT 1"; 

등등. 아무 것도 없거나 $ post_uri에서 기대하지 않는 것이있을 것입니다. 왜냐하면 mysql에 중요하지 않기 때문입니다. 어떻게 쿼리를 작성했는지 알 수 있습니다.

+0

이 깔끔한 트릭을 주셔서 감사합니다, 그것은 쿼리가 완벽하게 괜찮아요 나는 분명히 어딘가에 물건을 망치고있다. – CodeVirtuoso

0

비슷한 문제가있었습니다. 귀하의 구문이 좋아 보인다. db 연결 호출의 간단한 버전을 사용해보십시오. 다음은 실패한 (아래) 에 대해 작동 한 버전 (위)과 비교 한 것입니다.

$sqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db'); 
$mysqli->real_connect('localhost', 'my_user', 'my_password', 'my_db') 

나는 내 쿼리에서 변수를 사용했다하고 $mysqli->real_connect DB 연결을했다. 그럴 수 없습니다. 그러나 new mysqli 유형으로 전환했을 때 나는 변수 쿼리가 작동했음을 알게 된 에 놀랐습니다.

는 나는 당신을 위해 밖으로 작동 바랍니다.

+0

$ con-> options (MYSQLI_INIT_COMMAND, 'SET AUTOCOMMIT = 0')이 문제 일 수 있습니다. PHP의 문서에있는 코드 예제는 그 의미를 깨닫지 못하고 많은 사람들이 복사한다는 것을 보여줍니다. –

+0

'지금 약간 어렴풋이 나타나고 있지만, 당신이 말하는 것은 종소리입니다. 사실 real_connect와 관련된 제 코드는 남자 [UAL]로부터 직접 나온 것입니다. 그리고 네, 그것은 MYSQLI_INIT_COMMAND를 포함합니다. 데이터베이스 물건은 오히려 까다 롭고 노력하고 있습니다 :) –

관련 문제