2016-11-17 1 views
1
$name = $_POST["name"]; 
$address = $_POST["address"]; 
$city = $_POST["city"]; 
$state = $_POST["state"]; 
$zipcode = $_POST["zipcode"]; 
$country = $_POST["country"]; 
$month = $_POST["month"]; 
$day = $_POST["day"]; 

$conn = new mysqli($servername, $username, $password, $dbname); 
if ($conn->connect_error) { 
    die("Connection failed: " . $conn->connect_error); 
} 

$sql = "INSERT INTO birthdays (name, address, city, state, zipcode, country, month, day) 
VALUES ($_POST["name"], $_POST["address"], $_POST["city"], $_POST["state"], $_POST["zipcode"], $_POST["country"], $_POST["month"], $_POST["day"])"; 

if ($conn->query($sql) === TRUE) { 
    echo "You have been added to the birthday list"; 
} else { 
    echo "Error: " . $sql . "<br>" . $conn->error; 
} 
$conn->close(); 

로그인/데이터베이스에 데이터베이스 접두어를 포함해야합니까? 나는 지금 혼란 스럽다.데이터가 데이터베이스에 삽입되지 않습니다. 내가 뭘 잘못하고 있는지 확실하지 않다

sacrmfuw_sjay

+0

형식 코드는 ... 당신은 또한 정보를 추가 할 필요가 - 당신이에 연결하는 방법을 모르겠어요. 귀하의 질문에 "접두사를 사용해야합니까?"라고 묻는다면 제 질문은 "왜 시도하지 않으시겠습니까?"입니다. – Cyclonecode

+5

변수는 따옴표로 묶이지 않습니다. 당신이 질의를하면 SQL 주입에 대한 열정이 커질 것입니다. mysqli를 사용하고 있으므로 준비된 구문과 [bind_param] (http://php.net/manual/en/mysqli-stmt.bind-param.php)을 활용하고 이러한 성가신 인용 문제를 제거하십시오. – aynber

+1

구문 오류가 발생합니다. 여러분의''POST' 값에 대한''''는'$ sql' 캡슐화를 닫고 열었습니다. 그 값들은 삽입을 위해 따옴표로 묶어야합니다. 색상을 보면 당신은'mysqli '오류는 PHP가 파싱하지 않기 때문에 발생합니다. 오류 로그를 확인하십시오. '구문 분석 오류 : 예기치 않은 구문 오류' ''-https : //3v4l.org/OiUpU – chris85

답변

2

우리는 우리의 SQL 텍스트에 리터럴 값을 포함하기 위하여려고하는 경우에, 그것은 어떤 잠재적으로 안전하지 않은 값이 제대로 될 탈출하는 것이 필수적이다없이 sjay입니다 .. 접두사입니다. mysqli_real_escape_string 기능은 우리를 위해 맞춤 작성되었습니다.

$sql = "INSERT INTO birthdays (name, address, city, state, zipcode, country, month, day)" 
    . " VALUES" 
    . " ('" . $conn->real_escape_string($_POST["name"] ) . "'" 
    . ", '" . $conn->real_escape_string($_POST["address"]) . "'" 
    . ", '" . $conn->real_escape_string($_POST["city"] ) . "'" 
    . ", '" . $conn->real_escape_string($_POST["state"] ) . "'" 
    . ", '" . $conn->real_escape_string($_POST["zipcode"]) . "'" 
    . ", '" . $conn->real_escape_string($_POST["country"]) . "'" 
    . ", '" . $conn->real_escape_string($_POST["month"] ) . "'" 
    . ", '" . $conn->real_escape_string($_POST["day"] ) . "'" 
    . ")"; 

mysqli_real_escape_string 기능 에 사용되는 문에 포함되지 :

리터럴 값이 포함 SQL 텍스트를 만들려면, 우리는 같은 것을 할 수 있습니다. 식별자 중 하나 인 (열 이름, 테이블 이름)이 MySQL 예약어 인 경우 일반적으로 식별자를 역 따옴표 문자로 묶어 적절히 이스케이프 처리해야합니다.


바람직한 패턴은 SQL 텍스트의 리터럴 값을 포함하는 대신, 결합 자리와준비된 명령을 사용하는 것이다. 이 같은 정적 SQL 문 :

$sql = "INSERT INTO birthdays (name, address, city, state, zipcode, country, month, day)" 
    . " VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; 

는 그 다음 문에 SQL 텍스트를 준비하고 bind_param 값을 문에 다음 문을 실행합니다.

http://php.net/manual/en/mysqli-stmt.bind-param.php

+0

해결되었습니다 .. '$ sql = "생일 (이름, 주소, 도시, 주, 우편 번호, 국가, 월, 일) VALUES ($ _POST ["name "], $ _POST ["address "], $ $ _POST [ "country"], $ _POST [ "month"], $ _POST [ "day"]) ","_ 도시 "," 에 이 '$의 SQL = "sacrmfuw_birthdays.birthdays (이름, 주소, 도시, 주, 우편 번호, 국가, 월, 일) VALUES ('$ 이름', '$ 주소', '$ 도시'INTO INSERT –

+2

@JayS : 그 패턴은 SQL 주입에 취약한 것으로 보입니다. $ city가 "O'Fallon"이거나 $ name이 "D' Onofrio"일 때 어떤 일이 일어날 지 생각해보십시오. [Little Bobby Tables] (https://xkcd.com/ 327 /) 취약하지 않은 패턴을 채택하는 것이 어렵지 않을 때 SQL 주입에 취약한 코딩 패턴을 채택하는 길을 피하십시오. https://www.owasp.org/index.php/SQL_Injection – spencer7593

+0

@JayS : 스펜서가 맞습니다. 결코 그렇게 해선 안됩니다. 아주 나쁜 형태. 'bind_param()'(이 답변의 링크) 외에도'real_escape_string()'에 대해 읽어야합니다. http://php.net/manual/en/mysqli.real-escape-string.php –

관련 문제