【问题标题】:MySQL insert loop only inserts one rowMySQL插入循环只插入一行
【发布时间】:2013-07-27 10:10:25
【问题描述】:

我正在将一个旧表中的数据一次性导入(因此开销不是问题)到 Wordpress cmets 表中。我遍历旧表,使用 php 调整新表的一些数据,然后执行每个插入。它只会插入第一行。如果我再次运行代码,它将插入相同的第一行,所以我认为没有主键问题。

require('wp-config.php');

$con=mysqli_connect(DB_HOST,DB_USER,DB_PASSWORD,DB_NAME); 

$result = mysqli_query($con,"SELECT *
    FROM user_import u, wp_posts p, wp_postmeta m
    WHERE p.ID = m.post_id
    AND m.meta_key = 'fanfic_id'
    AND m.meta_value = u.fanfic_id");

while($row = mysqli_fetch_array($result))
  {
    $nick=$row['user_nickname'];
    $ip=$row['user_ip_address'];
    $date=strToTime($row['user_fanfic_date']);
    $date2=strftime('%Y-%m-%d 12:00:00',$date);
    $gmt=strftime('%Y-%m-%d 12:00:00', $date);
    $datemine = date('Y-m-d H:i:s', strtotime(str_replace('-', '/', $date)));

    $fanfic_id=$row['fanfic_id'];

    $getPostID="SELECT post_id FROM wp_postmeta WHERE meta_key='fanfic_id' and meta_value=$fanfic_id";

    $result2 = mysqli_query($con,$getPostID );

    while($row2 = mysqli_fetch_array($result2)){
      $post_id=$row2['post_id'];

    }

    $review=$row['user_fanfic_review'];
    $sql="INSERT INTO wp_comments(comment_approved, user_id, comment_post_id, comment_author, comment_author_ip, comment_date, comment_date_gmt, comment_content)
      VALUES(1, 0, $post_id,'$nick','$ip', '$date2', '$gmt', '$review') ";

    $result = mysqli_query($con,$sql);

  }

mysqli_close($con);

【问题讨论】:

  • 你为什么不用wordpress数据库对象$wpdbcodex.wordpress.org/Class_Reference/wpdb
  • $getPostID 查询是否返回多行?因为您在循环中获取结果,但每次都覆盖相同的变量。
  • 我不知道那个对象。我得看看它。谢谢。

标签: php mysql insert mysqli while-loop


【解决方案1】:

我相信是因为这条线

$sql="INSERT INTO wp_comments(comment_approved, user_id, comment_post_id, comment_author, comment_author_ip, comment_date, comment_date_gmt, comment_content)
  VALUES(1, 0, $post_id,'$nick','$ip', '$date2', '$gmt', '$review') ";
$result = mysqli_query($con,$sql); // <--- this line.

由于您将 SELECT 的 $result 重新分配给 INSERT 的结果。你能把那行改成这个吗?

 mysqli_query($con,$sql);

【讨论】:

  • 或者打电话给这个$result3,这样你就可以测试它是否成功。
  • @Barmar,真的。但是,在他的代码中,他没有检查是否成功,所以我只选择最小的代码。 :D
  • 从未使用过该值。除非稍后在使用 mysqli_query() 结果的循环中添加更多代码,否则应将其更改为 invisal 建议的内容。
【解决方案2】:

此时问题存在:

$getPostID="SELECT post_id FROM wp_postmeta WHERE meta_key='fanfic_id' and meta_value=$fanfic_id";

$result2 = mysqli_query($con,$getPostID );

while($row2 = mysqli_fetch_array($result2)){
 $post_id=$row2['post_id'];
}

你所做的总是在循环中得到相同的post_id。这意味着每次第一个 while 循环 while($row = mysqli_fetch_array($result)) 运行第二个 while 时,都会获取相同的数据并继续插入操作。

附:考虑使用$wpdb对象进行wordpress数据库操作http://codex.wordpress.org/Class_Reference/wpdb

【讨论】:

  • 我打算发布相同的答案,但我怀疑这个查询只返回一行。我见过很多人习惯性地在循环中调用fetch,即使是针对独特的查询也是如此。这就是为什么我在发布之前在评论中询问了这个问题。
猜你喜欢
  • 2015-05-10
  • 1970-01-01
  • 2014-07-20
  • 2012-07-10
  • 2022-01-07
  • 2014-04-04
  • 2015-01-14
  • 2014-01-19
  • 1970-01-01
相关资源
最近更新 更多