2011-08-26 109 views
1

我将帖子从我的WP博客移动到一个自定义网站。我制作了一个脚本来从WP SQL转储中提取需要的列,然后将其循环到新创建的表中。 WP表和我的数据库以及自定义表都使用UTF-8。我已经计算了我得到的行,在执行循环插入新信息之前和之后。帖子的数量是427,这是正确的帖子数量。但是,在数据库中只有234个帖子被插入,我怀疑它是MySQL无法插入某些帖子,但我不知道为什么。下面是代码:MySQL不插入所有行

<?php 

$con = mysql_connect('localhost', 'root', 'PASSWORD'); 
$select = mysql_select_db('blog'); 

mysql_query(" 
CREATE TABLE posts (
    id int(9) NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY(id), 
    title varchar(250) NOT NULL, 
    content longtext NOT NULL, 
    date varchar(90) NOT NULL, 
    deleted int(1) NOT NULL 
)") or die(mysql_error()); 

$query = mysql_query("SELECT post_date, post_title, post_content FROM sspe_posts WHERE post_type = 'post' AND post_status = 'publish'"); 

$i = 0; 

while ($row = mysql_fetch_array($query)) { 

    $oldPosts[$i]['title'] = $row['post_title']; 
    $oldPosts[$i]['date']  = $row['post_date']; 
    $oldPosts[$i]['content'] = $row['post_content']; 

    $i++; 

} 

$size = count($oldPosts); 

for ($x = 0; $x < $size; $x++) { 

    $title  = $oldPosts[$x]['title']; 
    $content = $oldPosts[$x]['content']; 
    $date  = $oldPosts[$x]['date']; 

    $query = mysql_query("INSERT INTO posts (title, content, date, deleted) VALUES ('$title', '$content', '$date', 0)"); 

} 

echo $x; 
+1

检查每个迭代的'mysql_error()':if(!$ query){echo mysql_error();}'这将清楚哪些失败以及为什么。 –

+2

检查您的脚本是否超过时间限制(默认为30秒) –

+0

您的插入查询容易受到sql注入的影响。如果您的帖子标题/内容包含任何引号('''),则查询将会中断。你不检查错误条件,并盲目地认为查询成功 - 这是一件非常糟糕的事情。 –

回答

0

如果你可以锁定你的表没有烦恼,我认为这是更好地运行:

$query = mysql_query("INSERT INTO posts (title, content, date, deleted) 
SELECT post_date, post_title, post_content, 0 FROM sspe_posts 
WHERE post_type = 'post' AND post_status = 'publish'"); 

而且你会避免循环。

2

Michael对你的脚本没有检查查询是成功还是失败是正确的。
您还可以“治疗”你把作为字符串文字到语句mysql_real_escape_string()

for ($x = 0; $x < $size; $x++) { 
    $title  = mysql_real_escape_string($oldPosts[$x]['title']); 
    $content = mysql_real_escape_string($oldPosts[$x]['content']); 
    $date  = mysql_real_escape_string($oldPosts[$x]['date']); 

    $query = " 
     INSERT INTO 
      posts 
      (title, content, date, deleted) 
     VALUES 
      ('$title', '$content', '$date', 0) 
    "; 

    $result = mysql_query($query); 
    if (!$result) { 
     die(mysql_error()."\n".$query); 
    } 
} 

的参数,但你的问题是更容易解决的东西像

INSERT INTO 
    posts 
    (title, content, date, deleted) 
SELECT 
    post_title, post_content, post_date, 0 
FROM 
    sspe_posts 
WHERE 
    post_type = 'post' 
    AND post_status = 'publish' 

看到http://dev.mysql.com/doc/refman/5.0/en/insert-select.html