代码之家  ›  专栏  ›  技术社区  ›  homework

用PHP格式化文本

  •  1
  • homework  · 技术社区  · 15 年前

    有没有一种方法可以格式化一个列表以便通过SQL插入它?

    我当前的列表格式是 test:test 我希望能够格式化它,这样它就可以插入到我的数据库中。

    INSERT INTO `test` (`user`, `file`) VALUES
    ('test', 'test'),
    ('test2', 'test2'),
    ('test@test3.com', 'test3');
    

    这有可能吗?

    <?
    if($_POST['oldlist']){
    
    $sql = "SELECT * FROM test WHERE user='$_POST[oldlist]'";
    $result = mysql_query($sql) or die(mysql_error());
    if(mysql_num_rows($result) > 0) { echo "exists";} else {
    
    $sqlq = "INSERT INTO test (`user` ,`file`)
    VALUES ('$_POST[oldlist]');";
    $add = mysql_query($sqlq) or die(mysql_error());
    if($add){echo "done";}else {echo "failed";}
    }}
    ?>
    

    用这种方法做什么?我希望能够发布一个列表,并将其插入到我的数据库中,但必须先对其进行格式化。

    2 回复  |  直到 10 年前
        1
  •  2
  •   mattbasta    15 年前

    代码中有严重的SQL注入缺陷。确保你逃避你的价值观!以下是我建议您转义代码并将其插入数据库的方法:

    <?php
    // Use isset to determine whether there is a value present
    if(isset($_POST['oldlist'])){
    
        $oldlist = $_POST['oldlist'];
        // Escape your data. Makes sure someone inject code that can jack your DB
        $oldlist_esc = mysql_real_escape_string($oldlist);
    
        $sql = "SELECT * FROM test WHERE user='$oldlist_esc'";
        $result = mysql_query($sql) or die(mysql_error());
        if(mysql_num_rows($result) > 0)
            echo "exists";
        else {
            // I'll assume your data is line-delimited
            $oldlist = explode("\n", $oldlist);
            $new_oldlist = $oldlist;
            foreach($oldlist as $key=>$value) {
                $new_oldlist[$key] = explode(" ", $value, 1); // I'll assume each line is space-delimited
    
                // Escape the new data
                foreach($new_oldlist[$key] as $new_key=>$new_value)
                    $new_oldlist[$kew_key] = mysql_real_escape_string($new_value);
            }
            $sqlq =    "INSERT INTO test (`user` ,`file`) VALUES ";
    
            // Build out the query
            $c = 0;
            foreach($new_oldlist as $value) {
                if($c++ > 0) $sqlq .= ',';
                $sqlq .= '("';
                $sqlq .= implode('","', $value);
                $sqlq .= '")';
            }
    
            $add = mysql_query($sqlq) or die(mysql_error());
            if($add)
                echo "done";
            else
                echo "failed";
        }
    }
    
    ?>
    

    可以在字符串中使用变量(例如:“asdfasdf$myvar asdfasdf”),但请记住使用 mysql_real_escape_string . 这样可以防止用户插入数据,如:

    ';DELETE FROM test WHERE true;--
    

    这将有效地清除数据库。希望这有帮助!

        2
  •  1
  •   Ast Derek    15 年前

    如果您的$\u post在数组中有一些成对的值,请尝试用“:”分解数组中的每个元素,并使用适合于单个插入的语法将它们连接起来,然后为多个插入连接整个数组:

    <?
    // Just added 'olduser' as it seemed to go with WHERE user=... , change to your needs
    if($_POST['olduser'] && $_POST['oldlist']){
    
    $sql = "SELECT * FROM test WHERE user='$_POST[olduser]'";
    $result = mysql_query($sql) or die(mysql_error());
    if(mysql_num_rows($result) > 0) { echo "exists";} else {
    
    foreach ($_POST['oldlist'] as &$each)
    {
        $each = explode(":",$each);
        $each = "('".join("','",$each)."')";
    }
    
    $_POST['oldlist'] = join(",",$_POST['oldlist']);
    
    // no semi-colon at end
    $sqlq = "INSERT INTO test (`user` ,`file`) VALUES $_POST[oldlist]";
    $add = mysql_query($sqlq) or die(mysql_error());
    if($add){echo "done";}else {echo "failed";}
    }}
    ?>
    

    不管怎样,请小心处理您的语句,如果不清除查询,即使在本地使用,我也不会保留它。