2017-02-17 14 views
0

私はプログラミング時に新しいです。データを挿入するために同じクエリを使用する方法

私は単純なゲストベークを作成しようとしています。 私はあなたの名字、姓と電子メールを登録できる1つのインデックスページを持っています。

名前をクリックすると、IDの新しいページにリダイレクトされます。

IDを使用して同じコードブロックでこのIDにテキストを挿入できるようになりました。

私のコードは次のようになっています。事前に

<?php 
    require('dbconfig.php'); 

try { 
     $conn = new PDO("mysql:host=$servername;dbname=projektone", $username, $password); 
     //Set PDO error mode to exception 
     $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

     // Insert to database 
     $sql = "INSERT INTO user (firstname, lastname, email) 
     VALUE ('".$_POST["first_name"]."','".$_POST["last_name"]."','".$_POST["email"]."')"; 
     $sql = "INSERT INTO user (guestbok) 
     VALUE ('".$_POST["guestbok"]."')"; 

     $conn->query($sql); 
     } 

     catch(PDOException $e) 
     { 
      echo $e->getMessage(); 
     } 

header('Location: /'); 
?> 

おかげ

/ダニエル・

+0

ちょうど同じクエリを使用しないでください。 2つのクエリがあるので、順番に実行します。それと同じくらい簡単です。 –

+2

あなたのコードは[SQLインジェクション]にオープンしています(http://stackoverflow.com/documentation/php/5828/pdo/2685/preventing-sql-injection-with-parameterized-queries) – Machavity

+0

エラーがありますか? ...間違った結果? 。何が問題なの?あなたの質問を適切なデータサンプルで更新してください – scaisEdge

答えて

-1

あなたはそれを実行する前に、新しいクエリでの$のSQLのparamを書き換えています。ここには2つのオプションがあります。

INSERTクエリ一つずつ:

$sql = "INSERT INTO user (firstname, lastname, email) VALUES ('".$_POST["first_name"]."','".$_POST["last_name"]."','".$_POST["email"]."')"; 
$conn->query($sql); 

$sql = "INSERT INTO user (guestbok) VALUES ('".$_POST["guestbok"]."')"; 
$conn->query($sql); 

を実行して1つの文字列に2つのクエリを置く:

$sql = " 
    INSERT INTO user (firstname, lastname, email) VALUES ('".$_POST["first_name"]."','".$_POST["last_name"]."','".$_POST["email"]."'); 
    INSERT INTO user (guestbok) VALUES ('".$_POST["guestbok"]."'); 
"; 
$conn->query($sql); 
+1

注射可能なコードをお勧めします。 :プレースホルダー:プレースホルダー:プレースホルダー!!! 1!elf! – cottton

0

[OK]を、おそらく私はあなたが必要なものを得ることができました。

$conn = new PDO("mysql:host=$servername;dbname=projektone", $username, $password); 
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

をして、データベース接続必要な場所、それを必要とする:あなたのdbconfig.phpに以下の2行を入れて

ファイル1:別のファイルに、次に

require('dbconfig.php'); 
$sql = "sql 1"; 
$conn->query($sql); 

require('dbconfig.php'); 
$sql = "sql 2"; 
$conn->query($sql); 
1

テキストの生のビットに結合し、それらをデータベースに渡して処理するのは良いIDではありませんea。それはSQL injectionにあなたのシステムを開きます。自分の名前にアポストロフィを持つ誰もがあなたが公開する要求

  • のロジックを破るだろう

    • :それは、誰かがあなたのサイトを危険にさらす可能性は低いですが唯一のINSERT文は、このように公開されたときに、それがあることを意味しません

    SQLインジェクションの問題に関して、あなたのシステムを保護する2つの方法があります - 1つは、追加されるSQL文字列を破ることはできません(たとえば、mysqli_real_escape_string()を使用します)が、r PDOを使用してDBMSとのコードの相互作用を仲介する際の推奨アプローチは、可変バインディングを使用することです。ここでは、データのプレースホルダを使用してSQLコマンドを作成し、実行時にそれらを置き換えます。

    あなたのIDはMySQLの自動挿入IDから生成されている場合、あなたは$ conn-から値を読み取ることができます>lastinsertid

    $stmt=$conn->prepare("INSERT INTO user (firstname, lastname, email) 
        VALUES (:fnm,:lnm,:eml)"); 
    $stmt->execute(array(
        ':fnm' => $_POST["first_name"], 
        ':lnm' => $_POST["last_name"], 
        ':eml' => $_POST["email"])); 
    $id=$conn->lastinsertid(); 
    

    あなたの次の問題は、ユーザーのページにしっかりとこれを通信する方法ですゲストブックのコメントを送信します(サンプルコードでは、両方の操作を同じページで実行しようとします)。

    ブラウザへの往復で送信すると、クッキーまたはフォーム変数として改ざんされる可能性があります。あなたがこれを行うことができますが、暗号化または暗号署名された秘密のステートレスソリューションがありますが、最も簡単な解決策はセッションを使用することです - すべてのページの上部にsession_start()を追加し、 $ _SESSIONのスーパーグローバルにあります。

    (だけでなく、セッションに関連するセキュリティ上の問題がある)

    あなたはゲストブックのデータを含むPOSTを受信したら、あなたはUPDATE user SET guestbook=:gstbk WHERE id=:id_from_sessionを使用する必要があります(またはあなたがforeign keyとしてidを持つ別々のテーブルに挿入でき)

    最後に、あなたのゲストブックに残っ人は、あなたがそこにある任意の不快からブラウザを保護することを確認してくださいあなたは、出力メッセージ:

    print htmlentities($guestbook); 
    
  • 関連する問題