一次将值插入多个MySQL表中

时间:2011-09-30 20:08:53

标签: php mysql

我创建了迷你内容管理系统。现在有了一些问题

我正在使用以下功能过滤帖子

function filter($data, $db)
{
    $data = trim(htmlentities(strip_tags($data)));
    if (get_magic_quotes_gpc())
    $data = stripslashes($data);
    $data = $db->escape_string($data);
    return $data;
}

PHP代码看起来像那样

$name=filter($_POST['name'], $db);
$title=filter($_POST['title'], $db);
$parent=filter($_POST['parent'],$db);
$switch=filter($_POST['switch'], $db);
    if($switch=''){
        echo "Return back and select an option";
        die();
    }
$parentcheck=filter($_POST['parentcheck'],$db);
    if($parentcheck=='0')
    {
        $parent=$parentcheck;
    }   
$purifier = new HTMLPurifier();
$content = $db->real_escape_string( $purifier->purify( $_POST['content']) );

if(isset($_POST['submit'])&&$_POST['submit']=='Ok'){
    $result=$db->query("INSERT INTO menu (parent, name, showinmenu) VALUES ('$parent', '$name', '$switch'") or die($db->error);
    $result2=$db->query("INSERT INTO pages (id, title, content) VALUES ('<what?>', '$title', '$content'") or die($db->error);           
    }

这就是我的表格的样子

表名为“pages” enter image description here

和“菜单”

enter image description here

我的问题如下:


  1. 我正试图从id表中获取自动增量menu('$parent', '$name', '$switch'")插入并在id表格中设置此pages 插入时($ title,$ content)。怎么做?有可能单身 查询?

  2. $content的值是带有HTML标记的文本。我正在使用html净化器。 我可以在插入db表之前过滤它的值吗?任何 建议/建议?

2 个答案:

答案 0 :(得分:1)

应该是

$result2=$db->query("INSERT INTO pages (id, title, content) VALUES (LAST_INSERT_ID(), '$title', '$content'") or die($db->error);

使用real_escape_string()进行过滤应该是安全的。还有其他想要过滤的内容吗?

答案 1 :(得分:1)

看起来您正在使用mysqli作为数据库库,因此您可以使用$db->insert_id()来检索由该特定数据库句柄执行的插入操作所创建的最后一个ID。所以你的查询将成为:

$result=$db->query("INSERT INTO menu (parent, name, showinmenu) VALUES ('$parent', '$name', '$switch'") 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);           
                                                                    ^^^^^^^

您无法在单个查询中真正执行此操作,因为在查询完成之后,mysql不会使insert_id函数的ID值可用。因此,您必须在3个步骤中执行此操作:插入,获取ID,再次插入。

DB过滤规则(更好地称为转义)是为了逃避用户提供的任何内容。这甚至包括您在其他数据库查询中检索并重新插入的数据。逃避并不是真正存在的安全措施 - 它可以确保您放入查询字符串的任何内容都不会破​​坏查询。防止SQL注入攻击只是其中一个副作用。

相关问题