InnoDB 데이터베이스에 두 개의 테이블이 있다고 가정 해 봅시다 : categories
및 jokes
; 그리고 나는 PHP/MySQLi을 사용하고 있습니다. 테이블이 너무과 같이 : 여기에 previous 대답mysqli, prepared statements, INSERT-SELECTs
CATEGORIES
id (int, primary, auto_inc) | category_name (varchar[64])
============================================================
1 knock, knock
JOKES
id (int, primary, auto_inc) | category_id (int) | joke_text (varchar[255])
=============================================================================
empty
감사합니다, 나는 당신이로 구성된 새로운 농담을 추가하려면 다음을 수행 할 수 있다는 것을 발견했다 $joke_text
, $category_id
을.
INSERT INTO jokes (category_id, joke_text)
SELECT c.id, '$joke_text'
FROM categories AS c WHERE c.id = $category_id;
이것은 $category_id
값이 기존의 카테고리 (내 질문은 나에게 "배울 수 있도록 목표로로 가, 외래 키의 문제를 무시하십시오를 의미 있는지 확인하기 위해, 외래 키를 사용하지 않고, 나를 수 있습니다 복잡한 "준비 문).
잘 작동했습니다. 그러나 나는 지금 준비된 진술을 배우려고 노력하고 있으며, 하루 종일 소비 한 후에 마침내 기초를 배웠다. 아쉽게도 절대적으로 ID가 없습니다 위의 SQL 쿼리를 mysqli 하에서 준비된 명령문으로 실행하는 방법과 온라인에서 그러한 문제에 관한 정보를 찾을 수 없었습니다.
누구든지 나를 도울 수 있다면, 나는 매우 감사 할 것입니다.
준비된 문을 사용하는 목적을 물리 치고 mysqli real_escape_string 기능을 가진 POST 데이터를 탈출 아닌가요? 준비된 문을 사용하여 해당 단계를 건너 뜁니다. 그렇지 않으면 addslashes 함수를 호출 한 다음 real_escape_string 함수로 이스케이프 처리하는 것과 같습니다. 또는 적어도 PDO로 이동하기 전에 MySQLi를 처음 사용할 때 읽은 것입니다. [http://stackoverflow.com/questions/6232084/is-mysql-real-escape-string-necessary-when-using-prepared-statements](http://stackoverflow.com/questions/6232084/is-mysql)을 참조하십시오. -real-escape-string-needed-prepared-prepared-statements 사용시) – Touch
안전하게 동의 할 수있는 그저 습관에 동의합니다. – skv
두 번 이스케이프 처리하면 결국 하나의 큰 따옴표가 전송 될 수 있습니다.이것이 내가 보안 문제를 보는 곳입니다. 습관을 제거하는 것이 가장 좋습니다. :) – Touch