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

Php 插入数据/更新(如果已存在),php,mysql,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'])) $

这个代码有效。如果用户第一次按下“保存”按钮或更新数据,我不知道如何将数据插入数据库

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

MySQL有一个功能,可以让您尝试插入一行,或者在发现重复键(即该行已经存在)时返回更新。

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

如果你需要我更彻底,请告诉我

编辑:更彻底

我将用一个简单、完整的例子来说明我的意思

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)
//Sanitize user input
if (isset('id',$_POST)) {
    //UPDATE database with user input
} else {
    //INSERT new rows into table with user input
}
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)
//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脚本,负责处理表单

如果用户访问Form.php时未指定ID(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将检查
$\u POST['id']
是否存在。因为DoForm没有发出INSERT命令来添加新页面

后来,用户意识到用户输入了一个错误,并去修复它。用户单击“NewPageName”的“编辑页面”控件,该控件将显示
http://example.com/Form.php?id=1

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>
DoForm看到id已设置,因此使用UPDATE而不是INSERT


更清楚吗?

如果他有id以外的密钥,那么这将是确定的方法,但基于上下文,我认为这不会起作用,因为其他数据完全可能不需要唯一。看看它,我能看到的唯一的可能性是有一个唯一的键是parent+name,但完全可行的是,他们希望有多个同名的孩子(可能不是最好的做法,但也不是最疯狂的)。更清楚的是,它的内容管理系统。假设用户添加了新页面。当用户第一次按下“保存”按钮时,它会插入具有新id的内容。我的html端通过ajax发送数据。例如,用户继续页面编辑并第二次按下“保存”。如何更新现有字段?如果可能,请编辑代码以明确其内容管理系统。假设用户添加了新页面。当用户第一次按下“保存”按钮时,它会插入具有新id的内容。我的html端通过ajax发送数据。例如,用户继续页面编辑并第二次按下“保存”。如何更新现有字段?如果可能,请编辑代码添加页面和编辑页面的HTML必须稍有不同。编辑页面时,需要添加包含页面ID的隐藏输入字段。然后,当他们单击保存按钮时,页面id将与页面数据一起传输。您的PHP将检查id是否已提交,就像您检查parentcheck一样,如果已提交,则使用该id执行更新。如果未提交,则执行插入操作,与您现在的操作完全相同。我无法编辑代码,因为这需要更改您未包含的代码。听着,db table生成我的id,它是自动递增的值。如果id根本不存在,如何检索它?用例1:新建页面。用户单击“新建页面”,脚本将生成一个不包含隐藏id元素的HTML表单。用户提交表单时,会使用INSERT命令创建一个新页面。这不是我的意思,但如果不查看/编辑整个代码,我不知道如何更好地解释它。我也早该睡觉了。
"name"  => "NewPageName"
"title" => "My First Webpag" [intetional typo, see later]
... other stuff ...
<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>
"id"    => 1
"name"  => "NewPageName"
"title" => "My First Webpage"
... other stuff ...