2017-11-30 6 views
-1

PHPSQL을 사용하고 있으며 등록시 두 개의 테이블에 사용자 데이터를 삽입하려고합니다. user_table의 첫 번째 메시지와 character_table의 두 번째 메시지 나는 자동으로 user_id을 생성하여 테이블을 연결하고 의 값을 얻고 INSERT (into user_table)부터 character_table의 열에 추가해야합니다.SQL, 이전 INSERT에서 자동 ID를 가져 오는 방법은 무엇입니까?

나는 몇 가지 방법을 시도했으며 여기서 끝났다 ($ username, $ email, $ password 및 $ character는 위에 정의 됨).

$sql = "INSERT INTO 
user_table (id, username, email, password) 
VALUES ('NULL', '".$username."', '".$email."', '".$password."') 

INSERT INTO 
character_table (name, id) 
VALUES ('".$character."', 'LAST_INSERT_ID()')";" 

user_table의 "id"를 character_table에 삽입 된 "id"와 일치 시키길 원합니다.

위를 실행할 때 아무 것도 일어나지 않는 것 같습니다. 이전 시도는 항상 id = 0으로 끝났습니다. 첫 번째 INSERT에서 ID를 얻을 수있는 올바른 방법은 무엇입니까?

+0

http://php.net/manual/en/function.mysql-insert-id .php – urfusion

+0

DB가 공격 받아 삭제 될 준비가 되셨습니까? 언젠가는 SQL 주입 방지 방법에 눈을 뜨게 될 무례한 깨우침을 얻을 수 있습니다. –

+0

다중 쿼리를 실행하려고하기 때문에 아무 일도 일어나지 않지만 그 쿼리를 실행하는 방법을 모르기 때문에 그럴 수 없습니다. –

답변

1
  1. 성명을 별도로 실행하십시오. 그런 다음 id 다음 삽입을 실행 한 후 mysql_insert_id를 사용하여 character_table
  2. 당신은 드실 수 id로 삽입을 실행 잡아, 당신의 user_table로 삽입을 실행합니다. Note that on the php webpagemysql_insert_id 기능이 더 이상 지원되지 않으므로 모두 mysql* 기능입니다. 그 결과로 ...
  3. 모든 것을 거룩하게하기 위해 변수를 INSERT 문에 직접 연결하지 마십시오. mysqli * 함수 또는 PDO로 전환하고 아직 작성하지 않은 경우 (쿼리를 매개 변수화하는) 준비된 명령문을 사용하십시오. mysql을 사용하여 응용 프로그램을 빌드하면 쿼리를 매개 변수화하지 않는다는 것을 의미합니다. 즉, SQL 주입 공격의 위험이 큽니다.

당신이 PDO 기능을 mysqli하거나 전환 할 때/당신이 동등한 mysqli_insert_id() (또는 PDO::lastInsertID()) 함수를 찾을 경우

+0

고맙다,이 wor ks! 별도의 진술을 실행하면 문제가 해결되어 이제는 원하는대로 작동합니다. mysql과 mysqli를 혼합 했습니까? 나는 눈치 채지 못 했습니까?내 모든 코드에서 mysqli를 사용하고있다. –

+0

오! 'mysql *'함수에 관해서는 실제로 지정하지 않았고 나는 다른 사람의 의견을 바탕으로 결론을 내리고있었습니다. 내 잘못이야. 즉, INSERT 문을 매개 변수화하지 않으므로 mysql 함수 만 사용하는 것처럼 공격 할 수 있습니다. [이 페이지를 확인하십시오] (http://php.net/manual/en/mysqli-stmt.bind-param.php)를 참조하여 SQL injection을 피하기 위해 매개 변수를 바인딩하는 방법을 알아보십시오 ("prepared statements"사용). – JNevill

+0

오, 나는 몰랐다. 다시 한번 감사 드리며, 나는 그것을 통해 확실히 읽을 것입니다. –