2012-06-22 85 views
2

我試圖從窗體更新表。通過形式更新php表

我有3頁。第一個用「編輯」鏈接查詢我表格中的所有行。 當點擊編輯(第2頁)的代碼拉$ ID,並把它的URL。 $ id從url中提取並用於查詢以填充表單。

我的問題是將更新的表單信息傳遞到我的表。基本上更新沒有發生。

第二頁

<?php 

    include '../db/config.php'; 
    include '../db/opendb.php'; 

$id = $_GET["id"]; 

    $order = "SELECT * FROM tableName where id='$id'"; 
    $result = mysql_query($order); 
    $row = mysql_fetch_array($result); 

    ?> 

    <form method="post" action="edit_data.php"> 
    <input type="hidden" name="id" value="<?php echo "$row[id]"?>"> 
    <tr>   
     <td>Title</td> 
<td> 
<input type="text" name="title" size="20" value="<?php echo"$row[title]"?>"> 
</td> 
    </tr> 
    <tr> 
     <td>Post</td> 
    <td> 
<input type="text" name="post" size="40" value="<?php echo 
    "$row[post]"?>"> 
</td></tr> 
<tr> 
<td align="right"> 
<input type="submit" name="submit value" value="Edit"> 
</td> 
    </tr> 
</form> 

*固定第三頁

    include '../db/config.php'; 
     include '../db/opendb.php'; 

if (isset($_POST[id])){ 
$id = mysql_real_escape_string(trim($_POST['id'])); 
    }else{ 
$id = NULL; 
    } 

if (isset($_POST[title])){ 
$title = mysql_real_escape_string(trim($_POST['title'])); 
    }else{ 
$title = NULL; 
    } 

if (isset($_POST[post])){ 
$post = mysql_real_escape_string(trim($_POST['post'])); 
    }else{ 
$post = NULL; 
    } 

$query = "UPDATE tableName SET title='$title', post='$post' WHERE id='$id'";   
mysql_query($query); 

?> 

在此先感謝:每個人)

*編輯感謝

+1

請注意,社區正在朝着使用PDO的方向發展:http://php.net/manual/en/book.pdo.php使用這不僅容易,而且可以幫助您避免SQL注入攻擊! –

+0

你看到了什麼錯誤信息? –

+0

排查使用數據庫UI(如phpMyAdmin)運行的查詢。 – Smandoli

回答

0
if (isset($_POST[title])){ 
$title = mysql_real_escape_string(trim($_POST['title'])); 
    }else{ 
$title = NULL; 
    } 

if (isset($_POST[post])){ 
$post = mysql_real_escape_string(trim($_POST['post'])); 
    }else{ 
$post = NULL; 
    } 


$query = "UPDATE tableName SET title='$title', post='$post' WHERE id='$id'";   
mysql_query($query); 

我也建議mysqli的功能,而不是MySQL的,我可能不會把一個變量和表列「後」,以避免混亂。

+0

非常感謝我也必須傳遞id到第三頁也與if(isset($ _ POST [id])){ $ id = mysql_real_escape_string(trim($ _ POST ['id'])) ; } else { $ id = NULL; } – hobbywebsite

2

應該

UPDATE tableName SET `title` = {$_POST['title']}, `post` = {$_POST['post']}... 

問問自己,你在設什麼?

+2

我也認爲你需要用{}包圍$ _POST,我不認爲字符串格式正確,否則。 – dotty

+0

謝謝,更新了我的回覆。 – sachleen

0

這是因爲您沒有設置值。在聲明中:

$query = "UPDATE tableName SET '$_POST[title]', '$post[post]' WHERE id='$id'"; 

你應該通過列名進行更新。

+1

$ query =「Update tableName(title,post)WHERE id ='$ id'」 VALUES ('_ _POST [title]','$ _ POST [post]')「; – hobbywebsite

+0

@hobbywebsite do not remember to use' mysql_real_escape_string()' – hjpotter92

1

您的數據庫更新的SQL語句是錯誤的。它不僅應包括新值也是相應的字段名稱的列表。這意味着它應該看起來更像是這樣的:

$query = "UPDATE tableName SET `title` = {$_POST['title']}, `post` = {$_POST['post']} WHERE id = '$id'"; 

注意,你也應該接受的$_POST領域用花括號({})字符串裏或把它們放在引號之外。 (如" = " .$_POST['title']. ", ")。如果您使用標準方式訪問那些帶有引號的人(例如,不是$_POST[title],而是$_POST['title']$_POST["title"]),則這是絕對必要的。

此外,您應該添加以下代碼:

  • 一些錯誤處理,目前你甚至不知道出事了。最簡單的方法是檢查mysql_query()函數的返回值null,如果它是null,則獲取mysql錯誤消息mysql_error()
  • 轉義傳遞的值。當前您直接將發佈的數據傳遞給非常不安全的mysql查詢。 (例如,請參閱SQL注入on wikipedia)在將所有表單數據插入查詢之前,您應該使用mysql_real_escape_string()。這逃避了所有可能具有惡意的部分。
0

如果你還沒有使用PDO語句來防止SQL注入攻擊,那麼你應該使用更多的保護,然後只是mysql_real_escape_string()。除了轉義數據之外,您應該驗證提交的數據實際上是您期望的。

即,在你的代碼在這裏:

$id = $_GET["id"]; 

    $order = "SELECT * FROM tableName where id='$id'"; 
    $result = mysql_query($order); 
    $row = mysql_fetch_array($result); 

如果你又說:

if(is_numeric($_GET['id'])){ 
    $id = mysql_real_escape_string(trim($_GET["id"])); 

    $order = "SELECT id, title, post FROM tableName where id='$id'"; 
    $result = mysql_query($order); 
    $row = mysql_fetch_array($result); 
    } 

這至少會驗證你正在執行什麼實際上是一個ID號(也就是說,如果ID實際上是一個數字;) 。如果您尚未使用PDO語句,則可以將此邏輯應用於所有輸入。如果您期待字母,然後驗證字母,數字驗證數字,轉義特殊字符。再次,這是最低限度。我真的建議閱讀數百種SQL注入技術,並開始閱讀PDO的技術。

另外,關於使用SELECT *語句。我會盡量避免它。它爲你的語句增加了一層漏洞,如果你改變了表中字段的順序並且你使用了$ row [0](Numbered requests),那麼它可以把事情弄糟,最後如果你的表包含附加的數據字段與你需要的那個無關,那麼你正在使用這個頁面,那麼你正在加載你不需要的信息。

$order = "SELECT id, title, post FROM tableName where id='$id'"; 

會很好地解決這個問題。 :) 祝你好運!