【问题标题】:MySQL inside for loop. Insert only runs on first loopMySQL 在 for 循环中。插入仅在第一个循环上运行
【发布时间】:2015-01-20 07:13:59
【问题描述】:

我创建了一个 for 循环,该循环遍历一个数组或从字符串分解的单词。 for 循环有效,并已通过 echo 语句进行测试。运行此代码时,它只将 1 条记录插入数据库,而不是数组中的字符串数。

$item=explode(" ", $items);
for ($i = 0; $i < count($item); ++$i) {
    // Create connection
$conn = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname);
// Check connection
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}

$sql = "INSERT INTO invlog (itemid, qty)
VALUES ('".$item[$i]."', '-1')";

if (mysqli_query($conn, $sql)) {
    echo "New record created successfully";
} else {
    echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}

mysqli_close($conn);    
    }

【问题讨论】:

  • 旁注:为什么不在循环之前取出该连接。无需每次迭代都连接/关闭
  • 您是收到错误消息还是似乎在静默失败?
  • 像这样为每次迭代连接和关闭是荒谬的。
  • 没有错误。我也试过很多次把 close 和 conn 都移到外面,仍然有同样的问题
  • @chuckbeyor $items 包含什么?您也应该将其发布在问题中。如果引用其中一个词,那么您的查询将被搞砸。你应该绑定它们。

标签: php mysql arrays for-loop


【解决方案1】:
$replacer  = array("\r\n", "\n", "\r", "\t", "  ");
$items = str_replace($replacer, " ", $items);
$item=explode(" ", $items);
// Create connection
$conn = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname);
// Check connection
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}


for ($i = 0; $i < count($item); ++$i) {

$sql = "INSERT INTO invlog (itemid, qty)
VALUES ('".$item[$i]."', '-1')";

if (mysqli_query($conn, $sql)) {
    echo "New record created successfully";
} else {
    echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}


    }
    mysqli_close($conn);  

【讨论】:

    【解决方案2】:

    为了提高效率并避免多次数据库调用,您实际上应该只执行一次语句。

    所以循环,创建查询,然后执行它。

    像这样..

    $item=explode(" ", $items);
    $query="";
     for ($i = 0; $i < count($item); ++$i) {
      // Build Query 
      $query.="(".$item[$i].",-1),";
     }
     $query = rtrim($query); // Remove last trailing comma from the right hand side of query string
    
     //Connect to database, and do DB stuff outside of loop in one call
     $conn = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname);
     // Check connection
     if (!$conn) {
        die("Connection failed: " . mysqli_connect_error());
     }
     $sql = "INSERT INTO invlog (itemid, qty)
     VALUES ".$query;
    
      if (mysqli_query($conn, $sql)) {
        echo "New records created successfully";
      } else {
        echo "Error: " . $sql . "<br>" . mysqli_error($conn);
      }
    
      mysqli_close($conn);    
    

    【讨论】:

    • 您的 SQL 语法有误;查看与您的 MySQL 服务器版本相对应的手册,了解在 '4321 9876 6543,-1),' 附近使用的正确语法
    • 试用逗号还在
    • @chuckbeyor 好吧,如果你看一下,它并没有真正爆炸。 '4321 9876 6543,-1),' 数字仍然用空格连接。你也应该在你的问题中输入var_dump($item)。并为此使用rtrim($query, ',')
    • 这是它进行的查询 (itemid, qty) VALUES (1234 4321 9876 6543,-1)
    • 我有一个问题。如果这些是在文本区域中提交的,并且每个都在一个新行上,这可能是个问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 2016-06-19
    • 2020-12-27
    相关资源
    最近更新 更多