2013-08-23 2 views
4

InnoDB 데이터베이스에 두 개의 테이블이 있다고 가정 해 봅시다 : categoriesjokes; 그리고 나는 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 하에서 준비된 명령문으로 실행하는 방법과 온라인에서 그러한 문제에 관한 정보를 찾을 수 없었습니다.

누구든지 나를 도울 수 있다면, 나는 매우 감사 할 것입니다.

답변

2

먼저 당신은 당신이

$stmt = $mysqli->prepare("INSERT INTO jokes (category_id, joke_text) 
SELECT c.id, ? 
FROM categories AS c WHERE c.id = ?;"); 

문이 매개 변수의이 '정수

$stmt->bind_param('si', $joke_text,$category_id); // bind to the parameters 

에 대한 문자열 데이터를 의미하고 난에 바인딩하기를 만든 일반 문처럼 아주 많이 문을 생성/* 준비된 명령문 실행 */

$stmt->execute(); 
+0

준비된 문을 사용하는 목적을 물리 치고 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

+0

안전하게 동의 할 수있는 그저 습관에 동의합니다. – skv

+0

두 번 이스케이프 처리하면 결국 하나의 큰 따옴표가 전송 될 수 있습니다.이것이 내가 보안 문제를 보는 곳입니다. 습관을 제거하는 것이 가장 좋습니다. :) – Touch

0

실제로 코드를 작성했지만 당신도 이것을 온라인으로 검색하고 있다는 것을 깨달았습니다. 그래서 대신에 PHP 웹 사이트에 대한 링크를 제공합니다.이 링크를 통해 많은 정보를 볼 수 있습니다. 당신이 MySQLi를 학습하고 있기 때문에

mysqli in general

Prepared statements

, 왜 그냥 대신 PDO로 이동하지. 매우 비슷하지만 이것이 미래가 어디로 향하는 지 생각합니다.

http://php.net/manual/en/book.pdo.php

http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers