2016-04-18 8 views
0

ここにあるサイトや他のサイトで何十ものスレッドをチェックしましたが、私のコードがうまくいかない理由がわかりません。私はWHEREを識別するために変数を使用してMySQLを更新するためにPHPを使用しようとしています。私が使っているコードは、変数をスワップすると数値になり、その変数はスクリプトのどこでも動作します。それはそうではないただ一つの行です。問題のWHERE句で変数を使用しているときにPHP MySQLのアップデートが機能しない

行は次のようになります。

$change = "UPDATE reg_info SET fname='$fname', lname='$lname', email='$email', explevel='$experience', addinfo='$additional', event='$regEvent' where id='$id'"; 

私も次のことを試してみた:

$change = mysqli_query("UPDATE reg_info SET fname='$fname', lname='$lname', email='$email', explevel='$experience', addinfo='$additional', event='$regEvent' where id='$id'"); 

$change = "UPDATE reg_info SET fname='$fname', lname='$lname', email='$email', explevel='$experience', addinfo='$additional', event='$regEvent' where id=".$id; 

$change = 'UPDATE reg_info SET fname="'.$fname.'", lname="'.$lname.'", email="'.$email.'", explevel="'.$experience.'", addinfo="'.$additional.'", event="'.$regEvent.'" where id='.$id; 

私は他のスレッドで見てきたものから、これらの少なくとも一つは、のために働いていたはずです私。

誰でも正しい方向に私を向けることができますか?

それはPHPコードの文字列全体が助け場合:

<?php 
$fnameErr = $lnameErr = $emailErr = $experienceErr = $regEventErr = ""; 
$fname = $lname = $email = $experience = $regEvent = ""; 
$id = $_GET["id"]; 
$errors = "yes"; 
$servername = "localhost"; 
$username = "root"; 
$password = "5tTtFzaz6dIO"; 
$database = "project2db"; 
$conn = new mysqli($servername, $username, $password, $database); 
$query = mysqli_query($conn, "SELECT * FROM reg_info where id=".$id); 
$row = mysqli_fetch_array($query, MYSQLI_NUM); 

    if ($_SERVER["REQUEST_METHOD"] == "POST") { 
    if (empty($_POST["fname"])) { 
     $fnameErr = "First name is required"; 
     $errors = "yes"; 
    } else { 
     $fname = test_input($_POST["fname"]); 
     if (!preg_match("/^[a-zA-Z ]*$/",$fname)) { 
     $fnameErr = "Only letters and white space allowed"; 
     $errors = "yes"; 
     } 
     else { 
     $errors = "no"; 
     } 
    } 

    if (empty($_POST["lname"])) { 
     $lnameErr = "Last name is required"; 
     $errors = "yes"; 
    } else { 
     $lname = test_input($_POST["lname"]); 
     if (!preg_match("/^[a-zA-Z ]*$/",$lname)) { 
     $lnameErr = "Only letters and white space allowed"; 
     $errors = "yes"; 
     } 
     else { 
     $errors = "no"; 
     } 
    } 

    if (empty($_POST["email"])) { 
     $emailErr = "Email is required"; 
     $errors = "yes"; 
    } else { 
     $email = test_input($_POST["email"]); 
     if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { 
     $emailErr = "Invalid email address"; 
     $errors = "yes"; 
     } 
     else { 
     $errors = "no"; 
     } 
    } 

    if (empty($_POST["experience"])) { 
     $experienceErr = "Experience level is required"; 
     $errors = "yes"; 
    } else { 
     $experience = test_input($_POST["experience"]); 
     $errors = "no"; 
    } 

    if (empty($_POST["additional"])) { 
     $regEvent = ""; 
    } else { 
     $additional = test_input($_POST["additional"]); 
    } 

    if (empty($_POST["regEvent"])) { 
     $regEventErr = "Event is required"; 
     $errors = "yes"; 
    } else { 
     $regEvent = test_input($_POST["regEvent"]); 
     $errors = "no"; 
    } 

    if($errors == "no") { 
     $change = 'UPDATE reg_info SET fname="'.$fname.'", lname="'.$lname.'", email="'.$email.'", explevel="'.$experience.'", addinfo="'.$additional.'", event="'.$regEvent.'" where id='.$id; 
     $result=$conn->query($change); 

     if ($result) { 
      echo '<script language="javascript">'; 
      echo 'alert("New record created successfully.")'; 
      echo '</script>'; 
      header('Location: regtable.php'); 
     } else { 
      echo '<script language="javascript">'; 
      echo 'alert("Error. New record not created.")'; 
      echo '</script>'; 
      header('Location: regtable.php'); 
     } 
    } 

    } 

    function test_input($data) { 
    $data = trim($data); 
    $data = stripslashes($data); 
    $data = htmlspecialchars($data); 
    return $data; 
    } 
    ?> 
+1

変数に引用符が含まれていますか?準備されたステートメントを見てください。また、現在何が起きているかを知るために、エラーをチェックしてください。 – chris85

+1

[Little Bobby](http://bobby-tables.com/)は[あなたのスクリプトはSQLインジェクション攻撃の危険にさらされていると言います。](http://stackoverflow.com/questions/60174/how-can-i-prevent -sql-injection-in-php)[MySQLi](http://php.net/manual/en/mysqli.quickstart)の[prepared](http://en.wikipedia.org/wiki/Prepared_statement)のステートメントについて学んでください。 .prepared-statements.php)。 [文字列をエスケープする](http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string)でも安全ではありません! –

+0

データベースに正常に接続できるかどうか最初にチェックしてください – Fil

答えて

0

自体にクエリーが有効であるので、私は何とかデータが問題を引き起こしていることだけを推測することができます。私はこの問題を考え出し

$fname = mysqli_real_escape_string($conn, $fname); 
$lname = mysqli_real_escape_string($conn, $lname); 
$email = mysqli_real_escape_string($conn, $email); 
$experience = mysqli_real_escape_string($conn, $experience); 
$additional = mysqli_real_escape_string($conn, $additional); 
$regEvent = mysqli_real_escape_string($conn, $regEvent); 
$id = mysqli_real_escape_string($conn, $id); 

$change = "UPDATE reg_info SET fname='$fname', lname='$lname', email='$email', explevel='$experience', addinfo='$additional', event='$regEvent' where id='$id'"; 
+0

idは通常数字ではありませんか?だから、なぜそこに引用符? – Reto

+1

@Reto '$ id'は何でもかまいません。引用符は整数にとって本当に重要ではなく、修正されます。文字列を引用するのはあまり許されません。整数を引用する場合とそうでない場合の詳細については、こちらを参照してください(http://stackoverflow.com/a/3308020/4333555)。 – chris85

+0

上記のコードを追加しようとしましたが、ページの動作に変更はありませんでした。 – Arinlome

1

:クエリで使用されるすべての値をエスケープ以下を、試してみてください!フォームが送信されるたびに、新しいPOSTデータに$ id変数を作成するためにPHPコードに渡されたhtml id = "id"に割り当てられたものはありませんでした。

フォームに何もなかったので、$ idはnullだったため、クエリと接続が完全に有効であっても、クエリはデータベースを更新しませんでした。

コメントとアドバイスを投稿したみなさん、本当にありがとうございます。

関連する問題