Вставка массива строк в таблицу SQL - PullRequest
1 голос
/ 06 августа 2009

Буду очень признателен, если вы посмотрите на этот фрагмент кода:

<?php
if(isset($_POST['add'])) {

$self = $_SERVER['PHP_SELF']; //the $self variable equals this file
$ipaddress = ("$_SERVER[REMOTE_ADDR]"); //the $ipaddress var equals users IP

//connect
$connect = mysql_connect($host,$username,$password) or die('<p class="error">Unable to 
connect to the database server at this time.</p>');
 mysql_select_db($database,$connect) or die('<p class="error">Unable to connect to the 
database at this time.</p>');

//fetch data
$data = htmlspecialchars($_POST['list']);
$comment =  mysql_real_escape_string($_POST['comment']);

$data_lines = explode( "\r\n", $data );
$comment_lines = explode( "\r\n", $comment );
for($i=0;$i<count($data_lines);$i++)
{
$data_fields = explode( ",", $data_lines[$i]);

  $time = time();
  $queryb = "INSERT INTO coords SET tag='$data_fields[0]', guild='$data_fields[1]', name='$data_fields[2]', base='$data_fields[3]', econ='$data_fields[5]', maxecon='$data_fields[6]', location='$data_fields[4]', comment='$comment_lines[$i]', ipaddress='$ipaddress' ,date='$time';";

  // if it succeeds, display message
  if (@mysql_query($queryb))
  {
     echo('<p class="success">Successful posting of ['.$data_fields[3].']!</p>');
  }
  else
  {
     echo('<p class="error">Error could not post ['.$data_fields[3].'] to database!</p>');
}
}//end for loop
}//end if $_POST['add'] statement
?>

Как видите, он получает данные, полученные при отправке формы, и разбивает их на строки.

Для $data он взрывается снова для каждой запятой. Затем он вставляет все для каждой запятой, в новый столбец и для каждой строки, в новую строку.

Теперь для $comment, он должен вставлять его в новую строку для каждой строки, чего не происходит. Уже несколько дней смотрю и проверяю его.

Столбец комментария - это varchar длиной 100.

В общем, он делает все, что мне нужно, кроме вставки $comment в новую строку для каждой строки.

Ответы [ 5 ]

1 голос
/ 06 августа 2009

попробуйте заменить "\r\n" на "\n"

0 голосов
/ 09 августа 2009

и спасибо, что потратили свое время на ответ на мой вопрос, но, похоже, я нашел решение, которое работает. Вот оно:

Функция mysql_real_escape_string () здесь, кажется, разбивает комментарии на части:

$comment =  mysql_real_escape_string($_POST['comment']);

Так что мне нужно было бы добавить дополнительный обратный слеш для каждого обратного слеша. Итак, здесь:

$comment_lines = explode( "\r\n", $comment );

Должно быть:

$comment_lines = explode( "\\r\\n", $comment );

Вместо.

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

0 голосов
/ 06 августа 2009

первый:

print_r($data_lines ) ."<br>";
print_r($comment_lines) ."<br>";

и затем для каждой вставки:

$queryb = "INSERT INTO coords SET 
    tag='" . $data_fields[0] ."',  
    guild='" . $data_fields[1] ."', 
    name='". $data_fields[2] ."', 
    base='".$data_fields[3]."', 
    econ='".$data_fields[5]."', 
    maxecon='".$data_fields[6]."', 
    location='".$data_fields[4]."', 
    comment='".$comment_lines[$i]."', 
    ipaddress='".$ipaddress."' ,
    date='".$time."';";

echo $queryb  . "<br><br>";

смотри, это то, что исходит от клиента.

print '<pre>'; 
for ($ ind = 0, $ ind <strlen ($ _POST [ 'comment']); $ ind + +) ( 
   $ w = substr ($ _POST [ 'comment'], $ ind, 1); 
   print $ w. "." ord ($ _POST [ 'comment']). "<br>; 
) 
print '</ pre>';
0 голосов
/ 06 августа 2009

Как упомянул plaindrom, вы должны попробовать заменить "\ r \ n" просто на "\ n", так как это будет охватывать оба случая, когда форма отправляется с "\ r \ n" и просто "\ n". Я бы сказал, что вы можете подумать о том, чтобы перенести свой выход в цикл, чтобы убедиться, что выход не вызывает проблем.

Вы также захотите добавить скобки вокруг переменных внутри строки запроса. Часто «некоторая строка $ array [0]» будет анализировать $ array, а не $ array [0]. Таким образом, вы хотели бы изменить свой запрос на:

$queryb = "INSERT INTO coords SET tag='{$data_fields[0]}', guild='{$data_fields[1]}', name='{$data_fields[2]}', base='{$data_fields[3]}', econ='{$data_fields[5]}', maxecon='{$data_fields[6]}', location='{$data_fields[4]}', comment='{$comment_lines[$i]}', ipaddress='$ipaddress' ,date='$time';";

С технической точки зрения вам не нужно делать это вокруг $ ipaddress и $ time, но это может быть неплохой идеей, хотя бы для согласованности.

0 голосов
/ 06 августа 2009

Я не совсем уверен, что точно понял ваш вопрос, но одна потенциальная проблема в вашей строке - интерполяция. Вы никогда не должны помещать массивы как этот без надлежащего побега. Правильная строка будет выглядеть примерно так:

$queryb = "INSERT INTO coords SET tag='{$data_fields[0]}', 
  guild='{$data_fields[1]}', name='{$data_fields[2]}', 
  base='{$data_fields[3]}', econ='{$data_fields[5]}', 
  maxecon='{$data_fields[6]}', location='{$data_fields[4]}', 
  comment='{$comment_lines[$i]}', ipaddress='$ipaddress' ,date='$time';";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...