2017-09-29 12 views
-1

私は何が間違っているのか私を逃れているように見える2つのコードを持っています。 このサイトを検索すると、同じ問題を抱える他の人がたくさんいます。与えられた答えのいくつかを使って、与えられたもので私のコードを作りましたが、役に立たなかったのです。 、渡されたすべての変数は(PHPファイルに「エコー」を使用して)私のフォームをテストするには、 私のフォームは、次のようになります。 フォームデータが自分のデータベースに格納されません

<div style="position: absolute; left: 10px; top: 290px; z-index: 6;"> 
     <form name="offerings" action="Offer_done.php" method="POST"> 
     <table> 
     <tr> 
     <td align="right">First Name:</td> 
     <td align="left"><input type="text" name="fname" required vspace="4" 
     /></td> 
     </tr> 
     <tr> 
     <td align="right">Last Name:</td> 
     <td align="left"><input type="text" name="lname" required vspace="4" 
     /></td> 
     </tr> 
     <tr> 
     <td align="right">Email:</td> 
     <td align="left"><input type="text" name="email" required vspace="4" 
     /></td> 
     </tr> 
     <tr> 
     <td align="right">Choose Your Card:</td> 
     <td><input list="card_type" name="card_type" required /></td> 
      <datalist id="card_type"> 
       <option value="American Express"> 
       <option value="Cirrus"> 
       <option value="Diners Club"> 
       <option value="Discover"> 
       <option value="MasterCard"> 
       <option value="Visa"> 
      </datalist> 
     </tr> 
     <tr> 
     <td align="right">Credit Card Num:</td> 
     <td align="left"><input type="text" name="c_number" required 
      SIZE="16" MAXLENGTH="16" vspace="4" /></td> 
     </tr> 
     <tr> 
     <td align="right">CV Code:</td> 
     <td align="left"><input type="text" name="cv_code" required SIZE="4" 
      MAXLENGTH="4" vspace="4" /></td> 
     </tr> 
     <tr> 
     <td align="right">Offering Amt($):</td> 
     <td align="left">$<input type="number" name="amount" value="1" 
      min="0" step="1.00" data-number-to-fixed="2" data-number- 
      stepfactor="100" class="currency" id="c1" name="money" required 
      SIZE="7" MAXLENGTH="7" vspace="4" /> 
     </tr> 
     <tr> 
     <td align="right"><INPUT TYPE="submit" VALUE="Submit Your Offering"> 
     </td> 

     <td><input action="action" onclick="window.history.go(-1); return 
      false;" type="button" value="Cancel - Back To Index Page" /></td> 
     </tr> 

    </table> 
    </form> 

    </div> 
    <!- - - - - - - - - - - - - - - - - - End Form- - - - - - - - - - - - - - 
    - - - - - - - -> 

処理し、このようになりますに送信する私のPHPファイル:

<?php 

    $conn = mysqli_connect("localhost", "root", "xuncle", "offerings"); 
    if(!$conn) { 
     die("connection failed: " .mysqli_connect_error()); 
    } 

     $fname = $_POST['fname']; 
     $lname = $_POST['lname']; 
     $email = $_POST['email']; 
     $card_type = $_POST['card_type']; 
     $c_number = $_POST['c_number']; 
     $cv_code = $_POST['cv_code']; 
     $amount = $_POST['amount']; 




    $mysqli_query = "INSERT INTO givers (fname, lname, email, card_type, 
    c_number, cv_code, amount) 
    VALUES ($fname, $lname, $email, $card_type, $c_number, $cv_code, 
    $amount)"; 

    $result = mysqli_query($conn,$sql); 

    header("Location: index.html"); 


    ?> 

誰かが私を正しい道に戻すことができますか?

+1

の可能性のある重複(https://stackoverflow.com/questions/11321491/when-to-use-single-quotes-二重引用符とバッククインズイン・mysql) – Qirel

+0

また、これは:https://stackoverflow.com/questions/4261133/php-notice-undefined-variable-notice-undefined-index-and-notice-undef – Qirel

+0

**危険**:あなたは** [SQLインジェクション攻撃](http://bobby-tables.com/)**に脆弱です**あなたは[防御]する必要があります(http://stackoverflow.com/questions/60174/best -way-to-prevent-sql-injection-in-php)から自分自身を削除します。 – Quentin

答えて

0

上記のコードでは、クエリ実行時に間違った変数にアクセスしています。また、あなたのコードは非常に危険です。したがって、あなたが使用しているAPIがサポートしているので、準備されたステートメントを使う必要があります。これはSQLインジェクションを防ぐのに役立ちます。

あなたの最終的なコードは次のようになります。

$conn = new mysqli("localhost", "root", "xuncle", "offerings"); 
    if(!$conn) { 
     die("connection failed: " .$conn->connect_error); 
    } 

    $stmt = $conn->prepare("INSERT INTO givers (fname, lname, email, card_type, c_number, cv_code, amount) VALUES (?, ?, ?, ?, ?, ?, ?)");//prepare the statement 
    $stmt->bind_param("sssssss", $fname, $lname, $email, $card_type, $c_number, $cv_code, $amount);//bind placeholders to variables 
    if($stmt->execute() === true){//everything went fine 
    header("Location: index.html"); 
     //echo 'Data saved successfully'; 
    } else { 
     echo 'Error. Data not saved. '.$conn->error;//get error 
    } 
+1

"*潜在的な回避策は、一重引用符でクエリ内の変数をラップすることです*"いいえ、それは "働く" - いくつかの変数に引用符があるまで。そしてそれらを伝えるのではなく、準備された声明をどのように使うべきかを示してみませんか? :-) – Qirel

+0

@Qirel私は準備済みの文でコードを更新しました。私はモバイルで入力していたので、以前はそれをしていませんでした;) – Akintunde007

1

あなたがここにあなたが@Akintundeがあまりにも述べたように$result = mysqli_query($conn,$mysqli_query);にそれを変更する必要があり、このライン$result = mysqli_query($conn,$sql);のタイプミスがありました。

prepared statementsを使用するようおすすめします。これらは、パラメータとは別にデータベースサーバに送信され、解析されるSQL文です。 [MySQLでは単一引用符、二重引用符、およびバッククォートを使用する]チェックHow can I prevent SQL injection in PHP?

<?php 
if(isset($_POST)){ 

    $conn = mysqli_connect("localhost", "root", "xuncle", "offerings"); 
    if (!$conn) { 
    die("connection failed: " . mysqli_connect_error()); 
    } 

    $result = mysqli_prepare($conn, "INSERT INTO `givers` (`fname`, `lname`, `email`, `card_type`, `c_number`, `cv_code`, `amount`) VALUES (?, ?, ?, ?, ?, ?, ?)"); 
    mysqli_stmt_bind_param($result, "ssssssd", $_POST['fname'],$_POST['lname'],$_POST['email'],$_POST['card_type'],$_POST['c_number'],$_POST['cv_code'],$_POST['amount']); 
    mysqli_stmt_execute($result); 

    header("Location: index.html"); 
} 
?> 
関連する問題