插入数据/更新(如果已存在)

时间:2011-10-04 06:17:38

标签: php mysql

此代码有效。我无法弄清楚如何将数据插入数据库中如果用户第一次按下“保存”按钮或更新数据。

php方面

<?php
require '../../core/includes/common.php';

$name=filter($_POST['name'], $db);
$title=filter($_POST['title'], $db);
$parentcheck=filter($_POST['parentcheck'],$db);
if(isset ($_POST['parent'])) $parent=filter($_POST['parent'],$db);
else $parent=$parentcheck;  
$menu=filter($_POST['menu'], $db);
$content = $db->escape_string($_POST['content']);

$result=$db->query("INSERT INTO menu (parent, name, showinmenu) VALUES ('$parent', '$name', '$menu')") or die($db->error);
$new_id = $db->insert_id;
$result2=$db->query("INSERT INTO pages (id, title, content) VALUES ('$new_id', '$title', '$content')") or die($db->error);  

if ($new_id>0){  
echo "{";  
echo '"msg": "success" ';
echo "}";  
}else{ 
echo "{"; 
echo
'"err": "error"';  
echo "}";  
}

?>

更新

感谢@jmlsteeke,我找到了方法

将这段代码放在html部分

<?php
$result=$db->query("INSERT INTO menu (parent, name, showinmenu) VALUES ('555', 'new', '0')") or die($db->error);
$new_id = $db->insert_id;
$result2=$db->query("INSERT INTO pages (id, title, content) VALUES ('$new_id', 'new', 'new')") or die($db->error);  

?>

并将以下代码添加到表单中

<input type="hidden" name="id" value="<?=$new_id?>"/>

在使用的服务器端脚本中

$result=$db->query("UPDATE pages AS p, menu AS m SET m.parent='$parent', m.name='$name', m.showinmenu='$menu', p.id='$id', p.title='$title', p.content='$content' WHERE m.id='$id' AND p.id=m.id") or die($db->error);

谢谢@jmlsteeke

2 个答案:

答案 0 :(得分:1)

MySQL具有INSERT ... ON DUPLICATE KEY UPDATE功能,可让您尝试插入行,或者如果发现重复键(即该行已存在)则回退到更新。

答案 1 :(得分:1)

常用的方法是在编辑页面时将id存储为隐藏字段。这样,当用户提交页面时,如果存在id,则发出UPDATE命令,如果没有存在,则表示它是新页面,并发出INSERT命令。

如果您需要我更透彻,请告诉我。

编辑:更加彻底

我将简单,完整地说明我的意思。

Form.php伪代码

//set default values for fields
//print form tag
if (isset($'id',$_GET)) {
    //fetch data from database
    //print hidden id field
    //override default values for fields
}
//print rest of fields using default values (possibly overridden)

DoForm.php伪代码

//Sanitize user input
if (isset('id',$_POST)) {
    //UPDATE database with user input
} else {
    //INSERT new rows into table with user input
}

假设您有一个名为Form.php的php文件,它负责显示表单,另一个名为DoForm.php的php脚本负责处理表单。

如果用户访问未指定ID的Form.php(http://example.com/Form.php),则会显示以下表单:

<form method="post" action="DoForm.php">
<input type="text" name="name" value="" />
<input type="text" name="title" value="" />
... other stuff ...
</form>

用户将添加一些信息,单击提交按钮,DoForm将获得以下POST变量:

"name"  => "NewPageName"
"title" => "My First Webpag" [intetional typo, see later]
... other stuff ...

DoForm会检查$_POST['id']是否存在。由于它没有DoForm发出INSERT命令来添加新页面。

稍后,用户意识到拼写错误,然后去修复它。用户单击“NewPageName”的“编辑页面”控件,该控件将为http://example.com/Form.php?id=1

Form.php看到id已设置,因此打印出来的表格如下:

<form method="post" action="DoForm.php">
<input type="hidden" name="id" value="1"
<input type="text" name="name" value="NewPageName" />
<input type="text" name="title" value="My First Webpag" />
... other stuff ...
</form>

用户修改其类型,将Webpag更改为网页,然后点击提交。 DoForm获得以下Post变量

"id"    => 1
"name"  => "NewPageName"
"title" => "My First Webpage"
... other stuff ...

DoForm看到id已设置,因此使用UPDATE而不是INSERT。

更清楚了吗?