2013-07-06 4 views
0

나는 이것이 간단한 문제라고 생각한다. 나는 어디서 또는 왜 찾을 수 없다. (이것이 중복되지 않기를 바란다.)PHP로 mysql 데이터베이스에 삽입하기

내 의도는 입력과 텍스트 영역에서 정보를 가져 와서 내 데이터베이스에 이미 "저널"이있는 적절한 테이블에 삽입하는 것이다. 그러나 제출을 명중하고 어떤 에러도받지 않고서는 데이터베이스에 추가 된 것이 없습니다 ... 생각?

여기
<fieldset> 
    <form method="post" action="push.php"> 
     <input type="text" name="datetitle" /><br /> 
     <textarea name="journalcontent"></textarea><br /> 
     <input type="submit" /> 
    </form> 
    <?php echo $datetitle ?> 
    <p><?php $output ?></p> 
</fieldset> 

하는 것은 명백한 부품 내 "인덱스"(push.php)이 생략 :

<?php 

$dsn = '*'; 
$username = '*'; 
$password = '*'; 

include "model.php"; 

try { 
    $db = new PDO($dsn, $username, $password); 
} catch (PDOException $exc) { 

    echo 'connection failed'; 
    exit; 
} 

echo 'goodzo'; 

$datetitle = $_POST['datetitle']; 
$journalcontent = $_POST['journalcontent']; 

if (!empty($datetitle)) { 
    $output = add_entry($datetitle, $journalcontent); 
} else { 
    $output = "empty"; 
} 

include "post.php"; 

?> 

그리고 마지막으로 내 모델

여기 내 "보기"(post.php)입니다 .php :

<?php 
function add_entry($datetitle, $journalcontent) { 
    global $db; 
    $query = 'INSERT INTO journals 
       (entry_date, contents) 
       VALUES 
       ($datetitle, $journalcontent)'; 
    try { 
     $statement = $db->prepare($query); 
     $statement->execute(); 
     $statement->closeCursor(); 
    } catch (PDOException $e) { 
     $error_message = $e->getMessage(); 
     display_db_error($error_message); 
    } 
} 
?> 
+0

PDO 연결 후에 model.php를 포함해야합니까? 그렇지 않으면 $ db는 아무 것도 가리 키지 않습니다 .... – KyleK

+0

@KyleK no, 함수가 호출 될 때만 참조됩니다. * PHP * – 19greg96

+0

[응용 프로그램에서 불쾌한 SQL 삽입 구멍을 고쳐야합니다.] (http://stackoverflow.com/questions/60174/how-to-prevent-sql-injection-in-php) – PeeHaa

답변

5

작은 따옴표를 사용하면 문자열의 변수가 확장되지 않습니다. 또한 정수가 아닌 경우 매개 변수를 따옴표로 묶어야합니다. 따라서 쿼리 할당은 다음과 같아야합니다.

$query = "INSERT INTO journals 
      (entry_date, contents) 
      VALUES 
      ('$datetitle', '$journalcontent')"; 

즉, 실제로 값을 쿼리에 전달해야합니다. 이런 식으로 :

$query = 'INSERT INTO journals 
      (entry_date, contents) 
      VALUES 
      (?, ?)'; 

$statement = $db->prepare($query); 
$statement->bindParam(0, $datetitle, PDO::PARAM_STR); 
$statement->bindParam(1, $journalcontent, PDO::PARAM_STR); 
$statement->execute(); 
+0

변경 사항을 적용했지만 아직 데이터베이스에 데이터가 삽입되어 있지는 않습니다. 그게 내 테이블에 문제가 있다는 건가요? (나는 DB에 확실히 성공적으로 연결하고있다.) – captainrad

+0

삽입 할 테이블에는 자동 증분 'id'인 기본 키인 추가 열이있다. 이것이 문제가 될 수 있습니까? – captainrad

+1

자동 증가 열에 아무 것도 삽입하지 않아도됩니다. 또한 원래 코드 (업데이트 된 따옴표가있는 첫 번째 예)를 계속 사용하고 있다면 매개 변수도 따옴표로 묶어야합니다. –

0

먼저 PDO의 오류보고를 켜야합니다. 나는 인해 SQL 구문 오류 및 인용 문자열의 부족으로

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$datetitle하지 않는 한 $journalcontent 모두 정수가, 쿼리가 실패합니다 사용할 수 있습니다. 가능한 한 주입뿐만 아니라이. 제를 피하려면 조회를 매개 변수화해야합니다.

$query = <<<SQL 
    INSERT INTO journals 
     (entry_date, contents) 
    VALUES 
     (?, ?) 
SQL; 
$statement = $db->prepare($query); 
$statement->execute(array($datetitle, $journalcontent)); 
관련 문제