Форматирование текста с помощью PHP - PullRequest
1 голос
/ 11 ноября 2009

Есть ли способ отформатировать список, чтобы я мог вставить его через 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 ]

2 голосов
/ 11 ноября 2009

В вашем коде есть неприятный недостаток 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;--

, которая эффективно уничтожит вашу базу данных. Надеюсь, это поможет!

1 голос
/ 11 ноября 2009

Если в вашем $ _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";}
}}
?>

В любом случае, будьте осторожны с вашими утверждениями, я не буду хранить их без очистки запросов даже для локального использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...