2016-06-20 3 views
0

나는 html 형식을 만들었고 사용자가 만든 mysqli 데이터베이스에 양식을 채울 데이터를 보내려고했습니다. 데이터베이스를 만들고 양식에있는 6 개의 필드에 대해 6 개의 열을 만들었습니다. 내가 작업을 수행하려면 다음의 PHP 코드를 작성하지만이 작동하지 않는 것 ...html 형식의 데이터를 mysqli 데이터베이스에 게시

<?php 
    //get the form elements and store them in variables 
    $firstname = $_POST['firstname']; 
    $lastname = $_POST['lastname']; 
    $email = $_POST['email']; 
    $phone = $_POST['phone']; 
    $postal = $_POST['postal']; 
    $acceptance = $_POST['acceptance']; 

    //establish connection 
    $con = mysqli_connect('localhost', 'db_user', 'db_password' , 'db_name', 'db_socket'); 
    //on connection failure, throw an error 
    if(!$con) { 
    die('Could not connect: '.mysql_error()); 
    } 

    $sql = 'INSERT INTO db_table1 (firstname, lastname, email, postal, phone, acceptance) 
VALUES ($_POST[firstname], $_POST[lastname], $_POST[email], $_POST[postal], $_POST[phone], $_POST[acceptance])' ; 

    if ($sql) { 
     echo 'Success'; 
    } 
    else { 
     die ('Error'); 
    } 

    $mysqli->close(); 

    //Redirects to the specified page 
    header("Location: http://www.example.com/success"); 
    ?> 

당신이 나를 도울 수 있을까요? 어디서 문제가 생기고 DB에 아무것도 들어 가지 않습니까?

+0

경고 ** ** mysql을 사용할 때 [매개 변수가있는 쿼리] (http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)와 ['bind_param' ] (http://php.net/manual/en/mysqli-stmt.bind-param.php)를 사용하여 쿼리에 사용자 데이터를 추가하십시오. ** 심각한 [SQL injection bug] (http://bobby-tables.com/)를 만들었 기 때문에 문자열 보간이나 연결을 사용하여 **이를 수행하지 마십시오. **'$ _POST' 또는'$ _GET' 데이터를 쿼리에 직접 입력하지 마십시오. 실수로 누군가를 악용하려고 시도하면 매우 위험 할 수 있습니다. – tadman

답변

0

여기에는 많은 문제가 있지만 가장 확실한 것은 SQL 쿼리를 문자열로 정의하고이 문자열이 존재하는지 테스트 한 다음 분명히이를 호출 한 다음 하루로 간주합니다. 그들은 그것이 중요하다고 생각하지만, 프로그래밍에 관해서는 더 명료해야합니다.

실제로 을 실행해야 쿼리를 실행하십시오. mysqli을 사용하면 준비, 바인딩, 실행 등의 여러 단계로 진행됩니다. 필요한 경우 가져 오기를 수행합니다. 항상 그렇듯이 have the documentation open if you're unfamiliar with how to do all of this. 그것은 무엇인가를 이해하는 데 필수적인 단계입니다. 객체 지향 표기법을 사용하는 일을하게 이것에

업데이트를 더 명확 많은 :

$con = new mysqli('localhost', 'db_user', 'db_password' , 'db_name', 'db_socket'); 

$stmt = $con->prepare('INSERT INTO db_table1 (firstname, lastname, email, postal, phone, acceptance) VALUES (?,?,?,?,?,?)'); 

$stmt->bind_param('ssssss', 
    $_POST[firstname], $_POST[lastname], 
    $_POST[email], $_POST[postal], 
    $_POST[phone], $_POST[acceptance] 
); 

$stmt->execute(); 

PHP 문자열에서 자신의 변수를 보간하지 않는 '$this'처럼 작은 따옴표를 사용하지만, 잊지 마세요 더블 인용 부호가있는 것은 "$this"과 같습니다. 이것이 원래 코드의 또 다른 문제점입니다. 문자열은 작은 따옴표로 둘러싸여있는 경우 (당신이했던 것처럼) 그것이

당신이 문자열이 포함되어있는 경우 모든 변수를 보간없이 그대로 촬영할 때 PHP에 유의하시기 바랍니다 귀하의 쿼리 문자열에 문제가

-1

변수를 큰 따옴표로 묶어야합니다.

따라서 작은 따옴표를 큰 따옴표로 바꾸면 쿼리에 변수를 포함하고이를 테스트하여 $ sql 변수를 인쇄 할 수 있습니다.

비록 코드가 작동하지만 mysqli를 사용하는 가장 좋은 방법은 아닙니다. 실제로 직접 쿼리 문자열에 변수를 사용하는 것과 mysqli benifits를 수확하는 mysqli에서 쿼리를 실행하기위한 prepossessed 쿼리에게 표준 3 단계를 사용하여이

$sql = 'INSERT INTO db_table1 (firstname, lastname, email, postal, phone,acceptance) VALUES ("'.$firstname.'","'.$lastname.'","'.$email.'","'.$postal.'","'.$phone.'","'.$acceptance.'",)' ; 
    $response= mysqli_query($con,$query); 

이것은 추가이 코드를 시도 SQL 인젝션 공격

1

에 코드를 취약하게 mysqli_query. 즉, 쿼리에 사용할 문자열을 만들었지 만 실제 쿼리는 수행하지 않았습니다.

관련 문제