0

我有这个:

<input type="text" name="menu_link_text*1" value="italian">
<input type="text" name="menu_link_text*2" value="english">

在我的数据库中的位置12识别语言 ( is lang_id)

我如何使用 php 将每个menu_link_text及其保存lang_id在此表结构中:

tb_menu_link:

menu_link_id
menu_link_text
lang_id

这是我的更新功能,我该如何更改?

$db->update(
'tb_menu_link_content',
array(
    'menu_link_text'=>$check->sanitize($_POST['menu_link_text']),
),
'menu_link_id = "'.$_POST['menu_link_id'].'" AND lang_id = "'.$_POST['lang_id'].'"');
4

2 回答 2

4

将输入转换为

<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 是可能的!!!

于 2013-10-08T11:43:06.233 回答
0

我只是简单介绍一下亨德里克的回答,

将输入转换为

<input type="text" name="menu_link_text[1]" value="italian">
<input type="text" name="menu_link_text[2]" value="english">

现在在 php 文件中进行以下更改,

$menu_link_text=$_POST['menu_link_text'];
echo $menu_link_text[1]; //it will print "italian"
echo $menu_link_text[2]; // it will print "english"
于 2013-10-08T11:52:21.277 回答