将一行数组插入SQL表

时间:2009-08-06 14:02:35

标签: php mysql sql

如果你看一下这段代码我真的很感激:

<?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,它应该将它插入每行的新行,而不是这样做。 现在正在寻找和测试它几天。

注释列是一个长度为100的varchar。

基本上,除了在每一行的新行上插入$comment之外,它会做我需要做的一切。

5 个答案:

答案 0 :(得分:1)

尝试用"\r\n"

替换"\n"

答案 1 :(得分: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';";

答案 2 :(得分:0)

正如plaindrom所提到的,你应该尝试用“\ n”替换“\ r \ n”,因为这将涵盖表单以“\ r \ n”和“\ n”提交的两种情况。我想你可能想考虑将你的转义移到循环中,以确保转义不会引起问题。

您还需要在查询字符串中的变量周围添加括号。通常,“some string $ 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来做这件事,但如果只是为了保持一致,这可能不是一个坏主意。

答案 3 :(得分:0)

第一

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>';

答案 4 :(得分:0)

感谢您花时间回答我的问题,但似乎我找到了一个有效的解决方案。在这里:

这里的mysql_real_escape_string()函数似乎打破了评论:

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

所以我需要做的是为每个反斜杠添加一个额外的反斜杠。 所以这里:

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

应该是:

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

相反。

无论如何,我必须再次感谢你花时间阅读我的问题并尝试解决它。​​