2012-06-22 43 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'"; 

会很好地解决这个问题。 :) 祝你好运!