Php 函数,用于保存由变量分隔的相同名称的文本输入


Php function to save text input with the same name separated by a variable

>我有这个:

<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'].'"');

将输入转换为

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

然后$_POST将容器(或者如果你使用它,则得到,但你应该在~99%的情况下使用POST(

array(
    "menu_link_text" =>  array(
        1 => "italian",
        2 => "english",
    )
)

现在,您可以轻松获取语言ID并将其与您的数据库匹配

我假设你,知道数据库是如何工作的+帖子

@edit评论后,A把它变成了一个巨大的帖子,但我希望它有所帮助

我不知道你的数据库方案是什么,所以我假设以下内容:

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

我只是在介绍亨德里克的回答,

将输入转换为

<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"