2012-06-19 10 views
0

MySQL PREPARE/EXECUTE 절과 PHP mysqli 준비/실행 방법간에 차이가 있는지 궁금합니다. 주사를 예방하는 것이 더 좋거나 나쁠까요?MySQL 준비 대 PHP mysqli 준비

몇 가지 데이터베이스 저장 프로 시저를 작성 중이므로 테이블과 특성이 컴파일시에 알 수 없기 때문에 궁금합니다. 정적으로 데이터를 쓸 수는 있지만 쿼리가 약간 복잡하고 많은 제어 논리를 사용하여 프로 시저를 부 풀릴 수 있습니다. 그것은 저에 대해 생각해 보았습니다. 그리고 나는 단지 간단한 문장이 필요할 때 동적 SQL을 사용하여 간단한 프로 시저를 작성하거나 PHP를 준비하고 바인딩하는 것이 더 나은지 궁금했습니다.

또한 이것이 반복이고 이미 답변 된 SO 질문에 대한 링크를 환영한다면 사과드립니다. 그러나, 나는 일반적으로 구글에 보였고, 이것에 대한 특정한 대답의 길을 찾지 못했습니다.

+0

[개요 - PHP 매뉴얼] (http://de3.php.net/manual/en/mysqli.overview.php) – adatapost

+0

[MySQL 매뉴얼] (http://dev.mysql.com/ doc/refman/5.0/ko/sql-syntax-prepared-statements.html)? 'PREPARE' /'EXECUTE' 문은 동일한 준비 메커니즘에 대한 인터페이스이지만 응용 프로그램 측면에서 준비된 명령문보다 효율적이지는 않습니다. – lanzz

+0

PHP 매뉴얼은 실제로 주입에 관한 질문에 답하지 않고 MySQL 매뉴얼도 대답하지 않습니다. – Perley

답변

3

PHP mysqli는 PHP에서 MySQL의 준비/실행 기능에 관한 계층입니다.

둘 다 사용자로부터 들어오는 모든 것이 바운드 변수에 채워지는 한 SQL 주입으로부터 안전합니다.

어느 쪽이든 처리 된 준비 문은보다 효율적인 대용량 작업을 위해 만들어졌습니다. MySQL에서 효율성 향상은 Oracle과 같은 고가의 DBMS에 비해 완만하지만 여전히 문제의 모든 부분을 해결할 가치가 있습니다.

앱에서 테이블 이름을 "변수"로 사용해야하는 경우 테이블 이름을 바운드 변수로 처리 할 수 ​​없습니다. 따라서 이러한 테이블 이름을 생성하는 사용자 입력에 대해 완전히 편집증이 있어야합니다.

+0

아, 그래. 그래서 mysqli 레이어는 일반 MySQL의 래퍼 일 뿐이며, 기본적으로 같은 방식으로 동작한다. 감사! 나는 사용자가 입력하기에 매우 논리적이지 않기 때문에 테이블 이름을 직접 사용하지는 않는다. 오히려 "테이블 이름"과 같은 사용자에게 좀 더 명확한 것을 사용하고 있습니다. 그런 다음 실제로 테이블 이름이 "tableName"과 같은 것으로 구문 분석합니다 (CamalCase를 좋아하기 때문에). – Perley

+0

오른쪽. 친숙한 로컬 사용자가 "; DROP TABLES"와 같은 테이블 이름을 줄 수 없도록하십시오! –

+0

글쎄, 내가 더 읽을 때 잘못된 것 같아? execute (어느 경우 든)는 하나의 명령문에 대해서만 작동한다고 말하는 문서 또는 faq을 기억합니다. "드롭 테이블 -"을 사용하면 쿼리가 두 개의 문장으로 바뀌므로 이해할 때 실행해서는 안됩니다. – Perley

관련 문제