试图用MYSQL和php添加记录到表中,使用强制唯一标识符


Trying to add records to a table with MYSQL and php, with a forced unique identifier

我正试图修改一个脚本,该脚本被开发为从Joomla (1.5.x)数据库导入文章记录到Wordpress 3.2.1表中的帖子。这是一个将内容从Joomla迁移到Wordpress的脚本。

我对脚本的问题是,它没有维护唯一标识符('id'在Joomla, 'id'在Wordpress)。根据我的理解,这使得处理重定向所有Joomla永久链接到新的(显然不同的)Wordpress永久链接变得更加复杂(更多的工作)。如果这个ID在WP和Joomla中是相同的,那么在htaccess中一些基本的重写规则就足以执行重定向了。

所以我想看看我是否可以修改代码来强制ID,而不是在记录插入到表中时按连续顺序生成ID。

我正在修改的脚本可在这里:http://wordpress.org/extend/plugins/joomla-to-wordpress-migrator/该文件名为:joomla2wp-mig.php

在第1049和1081行左右创建数组。在第1049行是:

 $wp_posts[] = array(
        'ID' => $R->id,  //I ADDED THIS IN
        'post_author' => $user_id,
        'post_category' => array($wp_cat_id),
        'post_content' => $post_content, 
        'post_date' => $R->created,
        'post_date_gmt' => $R->created,
        'post_modified' => $R->modified,
        'post_modified_gmt' => $R->modified,
        'post_title' => $R->title,
        'post_status' => 'publish',
        'comment_status' => 'open',
        'ping_status' => 'open',
        'post_name' => $R->alias,
        'tags_input' => $R->metakey, 
        'post_type' => 'post'
      );

在第1081行是:

 $array = array(
 "ID"        => $item['ID'],    //I ADDED THIS IN
 "post_author"       => $user_id,
 "post_parent"       => intval($wp_cat_id),
 "post_content"      => $item['post_content'],
 "post_date"         => $item['post_date'],
 "post_date_gmt"     => $item['post_date_gmt'],
 "post_modified"     => $item['post_modified'],
 "post_modified_gmt" => $item['post_modified_gmt'],
 "post_title"        => $item['post_title'],
 "post_status"       => $item['post_status'],
 "comment_status"    => $item['comment_status'],
 "ping_status"       => $item['ping_status'],
 "post_name"         => $item['post_name'],
 "post_type"         => $item['post_type']
      );

我已经注释了我添加到每个数组代码位顶部的ID行。

INSERT命令在第1097行左右执行

INSERT命令如下所示:

$insert_sql = "INSERT INTO " . $j2wp_wp_tb_prefix . "posts" . " set ";
$inserted = 0;
foreach ($array as $k => $v) 
{
  if($k AND $v) 
  {
    if($inserted > 0) 
      $insert_sql .= ",";
    $insert_sql .= " ".$k." = '".mysql_escape_string(str_replace("`","",$v))."'";
    ++$inserted;
  }
}    
$sql_query[] = $insert_sql;

}

使用MYSQL函数INSERT INTO…SET(与INSERT INTO…相反) )

我面临的挑战是:数组中没有包含ID,所以我添加了这个。

做了这个更改,当我运行脚本时,它会显示(在Wordpress UI端)运行良好,但没有插入记录,即使它说它是成功的。

我发现我可以通过设置一个有X个空白记录的新wp_posts表来解决这个问题。假设我要导入100篇文章,然后将100条记录放入表中,它们的ID为1到100。当我运行修改后的代码时,它将愉快地更新并填充这些现有记录。我不明白的是,当我强制唯一标识符(ID)为我想要的时,为什么它不会创建新记录。

我想知道我是否需要使用INSERT INTO…VALUE命令代替INSERT INTO…组

我本来打算测试一下的,但说实话我不是程序员,我只是即兴发挥一下。因此,我不知道如何重写PHP以实现VALUE命令所需的结构,以取代SET

如有任何帮助或建议,我将不胜感激。

我想我必须重写上面提供的最后一段代码。

在wordpress支持论坛上有一些关于这个问题的讨论。一个用户(spiff06)非常友好地帮助我解决了这个问题。我们解决了让代码插入带有强制标识符的新记录的问题,我使用了我们所说的"混乱"选项(这是我上面提到的方法……(用所需数量的空白记录建立一个表)

尽管我在自己的网站上使用了这种"混乱"的方法,但我希望在Joomla 1.5上的其他用户也能使用这种方法。x和切换到WP而不是升级到新的Joomla版本(这是一个很大的过程,所以很多人只是跳过WP,像我一样)。

With much thanks…

Jonathan

您可以尝试以下操作:

  1. 修改导入的mysql表(post@wordpress)的结构。更改id字段,使其不再是自动递增字段。

  2. 导入值。这样,您可以在字段ID中输入任何值,而不受任何限制。

  3. 输入后再次更改表的结构,将ID字段设置为自动递增字段。

我从来没有找到一个真正自动化/脚本化的方法来做这件事。我最后做了一个变通:

现在我已经导入了我所有的文章"凌乱"的方式,通过预填充表。

工作场所方法在WP数据库中预先填充wp_posts表,其中包含您需要的尽可能多的记录(查看Joomla以查看您有多少记录)。我有398条记录,所以我向wp_posts添加了398条记录。

如何?我通过将空wp_posts表导出到.csv文件来做到这一点。然后我在Excel中打开它(数字,或OpenOffice也可以)。在电子表格应用程序中,很容易在ID列中自动填充1到398。

然后我重新导入。csv文件到wp_posts。这给了我一个包含398行记录的wp_posts, ID字段为1到398。

然后我运行了1.5.4版本的Mambo/Joomla到WordPress迁移器,它可以从WordPress内部安装。

最终结果?

所有帖子的ID与Joomla的原始文章相同