将输入转换为
<input type="text" name="menu_link_text[1]" value="italian">
<input type="text" name="menu_link_text[2]" value="english">
然后$_POST
将容器(或者如果你使用它,你应该使用 POST 来处理大约 99% 的情况)
array(
"menu_link_text" => array(
1 => "italian",
2 => "english",
)
)
现在您可以轻松获取语言 ID 并将其与您的数据库匹配
我假设您知道数据库的工作原理+发布
评论后@edit,将其变成了一个巨大的帖子,但我希望它有所帮助
我不知道您的数据库方案是什么,所以我假设以下内容:
menu_link_id INT
lang_id INT
text VARCHAR
在您的帖子中,您发送 menu_link_id (可以为空)和输入(如答案中给出)
一个简单的帖子将如下所示:
array(
"menu_link_id" => "1", // can also be "", so a new menu link is made
"menu_link_text" => array(
1 => "italian",
2 => "english",
)
)
首先你应该检查值是否存在,并且是有效值
menu_link_id
是有效的,当它是数字或字符串长度为0
menu_link_text
时,它是一个数组是有效的
if (
// simple check if the values exists
(isset($_POST['menu_link_id'] && isset($_POST['menu_link_text'])
// check if the id is valid
&& (is_numeric($_POST['menu_link_id']) || strlen($_POST['menu_link_id'] == 0)
// check if the text is valid
&& (is_array($_POST['menu_link_text']))
)
知道我们知道我们有“有效”数据,我们应该开始保存(更新或插入它)(我不是 MySQL 人,但知道你可以在一个语句中做到这一点(更新和插入)但我不知道如何)
现在我们应该开始保存它。首先,我们创建一个使用过的 lang_ids 数组。这将用于匹配它是新的还是已经存在的。我不知道您如何使用哪个或什么数据库,所以我假设是 MySQl,然后是 PDO。我还假设在整个项目中该值$db
与 pdo 连接相等
$lank_ids = array();
if (strlen($_POST['menu_link_id'] > 0) {
$action = $db->prepare('SELECT lang_id FROM menu_items WHERE menu_link_id = :id');
// I already validated the value, but be defensive and be always save (so always use protection)
$action->execute(array(':id' => $_POST['menu_link_id']));
$lank_ids = $action->fetchColumn();
}
现在我们将插入那些大坝值
$valid_lang_ids = array(1, 2);
foreach($_POST['menu_link_text'] as $lang_id => $text) {
// Check the lang_ids are valid, I use now a hardcoded array
if(in_array($lang_id, $valid_lang_ids)) {
if (in_array($lang_id, $lank_ids )) {
// The lang_id is already know so update
$action = $db->prepare('UPDATE menu_items SET text = :text WHERE menu_item_id = :id AND lang_id = :lang_id');
$action->execute(array(
':id' => $_POST['menu_link_id'],
':lang_id' => $lang_id,
':text' => $text
);
} else {
// The lang_id is not set, so insert
$action = $db->prepare('INSERT INTO menu_items (menu_link_id, lang_id, text) VALUES (:id, :lang_id, :text)';
$action->execute(array(
':id' => $_POST['menu_link_id'],
':lang_id' => $lang_id,
':text' => $text
);
}
}
}
警告
几乎所有的代码都已经死了,所以我认为它有一些错误,但主线应该清楚我没有清理文本,所以 XSS 是可能的!!!