sql插入后不插入一些记录

时间:2012-12-03 09:53:51

标签: php mysql sql-insert

我已成功插入数据库,但它没有插入任何内容,我实际上没有更改代码。

可能是什么原因?

while ($row = mysql_fetch_array($new_entries)){
    $anzeigen_id = $row[0];
    $firma_id = $row[1];
    $xml_filename = "xml/".$anzeigen_id.".xml";
    $dom = new DOMDocument();
    $dom->load($xml_filename);
    $value = $dom->getElementsByTagName('FormattedPositionDescription');
    foreach($value as $v){
        $text = $v->getElementsByTagName('Value');
        foreach($text as $t){
            $anzeige_txt = $t->nodeValue;
            $anzeige_txt = utf8_decode($anzeige_txt);
            $sql = "INSERT INTO testing (`firmen_id`,`anzeige_id`,`anzeige_txt`) VALUES ('$firma_id','$anzeigen_id','$anzeige_txt')";
            $sql_inserted = mysql_query($sql);
            if($sql_inserted){
                echo "'$anzeigen_id' from $xml_filename inserted<br />";
            }

        }
    }
}

3 个答案:

答案 0 :(得分:1)

好吧,我会发一个答案,因为问一些代码示例会更清楚等等。

首先,当你遇到这样一个无法解释的案例时:你应该调试!

在您的情况下,您在查询成功时显示一条消息。但如果查询失败怎么办?您应该处理错误消息以查看正在发生的事情。这样的事情:

if($sql_inserted)
{
  echo "'$anzeigen_id' from $xml_filename inserted<br />";
}
else
{
  throw new Exception(mysql_error() . '. SQL: '.$sql);
}

查询失败时会出现异常。您将收到错误消息(mysql_error())和失败的查询($sql)。

可能存在的问题是,您没有逃避查询中的值。因此,如果变量中有',它将破坏查询。你应该逃避他们:

$firma_id    = mysql_real_escape_string($firma_id);
$anzeigen_id = mysql_real_escape_string($anzeigen_id);
$anzeige_txt = mysql_real_escape_string($anzeige_txt);

所以你将得到这样的最终代码:

foreach($text as $t)
{
  $firma_id    = mysql_real_escape_string($firma_id);
  $anzeigen_id = mysql_real_escape_string($anzeigen_id);
  $anzeige_txt = mysql_real_escape_string(utf8_decode($t->nodeValue));

  $sql = "INSERT INTO testing (`firmen_id`,`anzeige_id`,`anzeige_txt`) VALUES ('$firma_id','$anzeigen_id','$anzeige_txt')";
  $sql_inserted = mysql_query($sql);

  if($sql_inserted)
  {
    echo "'$anzeigen_id' from $xml_filename inserted<br />";
  }
  else
  {
    throw new Exception(mysql_error() . '. SQL: '.$sql);
  }
}

顺便说一下,就像我告诉你please, don't use mysql_* functions in new code一样。它们不再被维护,deprecation process已经开始了。请参阅red box?转而了解prepared statements,并使用PDOMySQLi - this article将帮助您确定哪个。如果您选择PDO here is a good tutorial

答案 1 :(得分:1)

它无效的原因是您无法清理输入。考虑:

$anzeigen_id = mysql_real_escape_string($row[0]);
$firma_id = mysql_real_escape_string($row[1]);
....
$anzeige_txt = mysql_real_escape_string(utf8_decode($t->nodeValue));

您应该了解SQL注入的风险以及如何预防它。

您还应该在代码中进行适当的错误检查。

答案 2 :(得分:0)

试试这个......

$sql = "";
$comma = "";
while ($row = mysql_fetch_array($new_entries)){
    $anzeigen_id = $row[0];
    $firma_id = $row[1];
    $xml_filename = "xml/".$anzeigen_id.".xml";
    $dom = new DOMDocument();
    $dom->load($xml_filename);
    $value = $dom->getElementsByTagName('FormattedPositionDescription');
    foreach($value as $v){
        $text = $v->getElementsByTagName('Value');
        foreach($text as $t){
            $anzeige_txt = $t->nodeValue;
            $anzeige_txt = utf8_decode($anzeige_txt);
            $sql .= "$comma ('$firma_id','$anzeigen_id','$anzeige_txt')";
            $comma = ", ";

        }
    }
}
$sql = "INSERT INTO testing (`firmen_id`,`anzeige_id`,`anzeige_txt`) VALUES $sql";
$sql_inserted = mysql_query($sql);