2017-06-08 27 views
1

我正在從上一頁的URL傳遞一個id,然後嘗試更新該id行中的數據庫值。我覺得我很接近。當我添加到更新查詢中時,我可以更新值librarian_fname特定的ID號碼,但是當我嘗試通過代碼傳遞該值時,它不能選擇它,因爲當我使用id = '$id'時它不會更新。不知道我做錯了什麼。如果這不是完美的,我仍然在學習如此原諒我。PHP更新數據,其中有ID匹配

<?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?你需要學習的一件事是如何*調試*你的程序。請求互聯網調試您的程序*不*效率高或可擴展。我建議你在$ id包含在SQL語句之前回顯$ id的值,回顯SQL語句,並確定代碼是否達到這一點。 https://ericlippert.com/2014/03/05/how-to-debug-small-programs/ – spencer7593

+0

我是PHP新手,所以我會看看PDO/mysqli。謝謝你的鏈接。我正在學習調試,並試圖在頁面頂部回顯出該ID,但它並未傳遞到SQL語句中。 –

+0

$ sql =「UPDATE table SET librarian_fname = $ librarian_fname WHERE id = $ id」;替換它 –

回答

0

試試這個

<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

我想的問題之一可能是TABLE是一個MySQL的保留字。

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'開始的語法問題。調試代碼並不是非常困難。但是,通過檢查和評估與正在執行的代碼不同的代碼,通常會使* not *變得更容易。 – spencer7593

+0

無論代碼是否存在密碼保護問題,我都建議學習良好的編碼習慣。實際上,這比實踐中強化的不好的編碼實踐更容易(更少的工作)。更好地練習正確的方式。並且沒有必要用更多的不安全代碼示例來拋棄StackOverflow。 – spencer7593

相關問題