2017-06-08 7 views
1

前のページのURLからIDを渡して、そのIDの行のデータベース値を更新しようとしています。私は近くにいるように感じる。私は更新クエリに特定のID番号を追加するときに値librarian_fnameを更新することができますが、コードを介してその値を渡すと、使用時に更新されないため、その値を取得してはいけません。id = '$id' 。私が間違っていることを確信していない。これが完璧でない場合、私はまだ学んでいるので、私を許してください。ID一致のあるPHP UPDATEデータ

<?php 
$id = $_GET['id']; 
echo $id; 
?> 
    <?php 
    // This function will run within each post array including multi-dimensional arrays 
function ExtendedAddslash(&$params) 
{ 
     foreach ($params as &$var) { 
      // check if $var is an array. If yes, it will start another ExtendedAddslash() function to loop to each key inside. 
      is_array($var) ? ExtendedAddslash($var) : $var=addslashes($var); 
      unset($var); 
     } 
} 

// Initialize ExtendedAddslash() function for every $_POST variable 
ExtendedAddslash($_POST); 

      $librarian_fname = $_POST['librarian_fname']; 
      $id = $_POST['id']; 
?> 

     <?php 
     if(isset($_POST['add'])) { 
      $dbhost = 'localhost'; 
      $dbuser = ''; 
      $dbpass = ''; 
      $conn = mysql_connect($dbhost, $dbuser, $dbpass); 

      if(! $conn) { 
       die('Could not connect: ' . mysql_error()); 
      } 
      $sql = "UPDATE table SET librarian_fname = '$librarian_fname' WHERE id = '$id'"; 
      mysql_select_db('Events'); 
      $result = mysql_query($sql, $conn); 

      if(! $result) { 
       die('Could not enter data: ' . mysql_error()); 
      } 

      mysql_close($conn); 
      header("Location: search.php"); 
     } 

     else { 
      ?> 

      <?php 
// define variables and set to empty values 
$librarian_fname = $id = ""; 

if ($_SERVER["REQUEST_METHOD"] == "POST") { 
    $librarian_fname = test_input($_POST["librarian_fname"]); 
    $id = test_input($_POST["id"]); 
} 

function test_input($data) { 
    $data = trim($data); 
    $data = stripslashes($data); 
    $data = htmlspecialchars($data); 
    return $data; 
} 

?> 
<form method="post" action="<?php echo htmlspecialchars($_SERVER[" PHP_SELF "]);?>"> 
        <legend><b>Appointment Topic</b></legend> 
        <input type="hidden" name="id" value="<? echo $id; ?>"> 
        <label for="librarian_fname">First Name <em>*</em></label> 
        <input type="text" name="librarian_fname" size="50" required="no" validateat="onsubmit" message="Please enter your first name."> input name = "add" type = "submit" id = "add" value = "Submit"> 
       </form> 
       <?php 
     } 
     ?> 
+0

あなたの学習が廃止予定のmysql_インターフェイス関数(PHP 7では削除されています)を使用していて、PDOやmysqliを学習していないという特別な理由はありますか?あなたが学ぶ必要があるものの1つは、あなたのプログラムをデバッグする方法です。あなたのプログラムをデバッグするようにインターネットに依頼することは、効率的でもスケーラブルでもありません。 SQLステートメントにインクルードされる前に$ idの値をエコーアウトし、SQLステートメントをエコーし​​て、コードがそのポイントに達しているかどうかを調べることをお勧めします。 https://ericlippert.com/2014/03/05/how-to-debug-small-programs/ – spencer7593

+0

PHPが初めてのので、PDO/mysqliを見ていきます。リンクありがとうございました。私はまた、デバッグすることを学んで、私のページの上部にIDをエコーし​​ようとしましたが、SQLステートメントに渡されていません。 –

+0

$ sql = "UPDATEテーブルの設定librarian_fname = $ librarian_fname WHERE id = $ id";それを置き換えてください –

答えて

0

私は問題の一つはTABLEは、MySQLの予約語であることかもしれないと思う。この

<form method="post" action="<?php echo htmlspecialchars($_SERVER[" PHP_SELF "]);?>"> 
         <legend><b>Appointment Topic</b></legend> 
         <input type="hidden" name="id" value="<?php echo $_GET['id']; ?>"> 
         <label for="librarian_fname">First Name <em>*</em></label> 
         <input type="text" name="librarian_fname" size="50" required="no" validateat="onsubmit" message="Please enter your first name."> <input name = "add" type = "submit" id = "add" value = "Submit"> 
         <input type="reset" name="resetButton" id="resetButton" vvalue="Reset Form" style="margin-right: 20px;" /> 
    </form> 
+0

それが問題でした。私はそれが何か単純だと思った。それは実際にフォームの中で最初にそれを取得する必要がある理由には実際に意味があります。ありがとうございました! –

+0

あなたのIDは隠し値が空だと思う – Arun

0

を試してみてください。

https://dev.mysql.com/doc/refman/5.5/en/keywords.html

我々は、識別子(例えばテーブル名)として予約語を使用したい場合は、エスケープする必要があります。識別子をエスケープするMySQLの規範的なパターンは、単一のバックティック文字で囲むことです。

UPDATE `table` SET 

これは、識別子が予約語であるかどうかに関係なく機能します。テーブルの名前を変える方が良いでしょう。


コードがSQLインジェクションに対して脆弱であるように見えることに注意してください。 SQL文のテキストに組み込まれた潜在的に危険な値は、適切には、(例えば使用mysqli_real_escape_string)

https://xkcd.com/327/

好ましいパターンを用意を使用する代わりに、SQL文に値を組み込み、そしてないにあるエスケープでなければなりませんステートメントバインドプレースホルダ

+0

ありがとう、@ spencer7593。別のテーブル名を使用しましたが、ここでは共有しませんでした。SQLインジェクションについて理解していても、そのことをまだ理解していますが、この特定のコードはパスワードで保護されたフォルダに格納されます。私は攻撃がまだ起こるかもしれないことを実感します。 –

+0

質問にはコメントがあります。これを試してみると、このエラーが発生します:** '...近いテーブルを使用する正しい構文SET librarian_fname =' **これはMySQLが'table'で始まる文法問題です。デバッグコードは非常に難しいものではありません。しかし、実行されているコードとは異なる*コードを調べて評価することで、通常は* * *できなくなります。 – spencer7593

+0

コードがパスワードで保護されているかどうかにかかわらず、良いコーディング手法を習得することをおすすめします。実践で強化されている悪いコーディング慣行を逃してしまうよりも実際には簡単です(仕事は少なくなります)。適切な方法で練習することをお勧めします。さらに、安全でないコードの例を使ってStackOverflowを捨てる必要はありません。 – spencer7593

関連する問題