2011-08-26 107 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