2013-07-27 4 views
0

Я делаю одноразовый импорт данных (так что служебные данные не являются проблемой) из одной старой таблицы в таблицу комментариев Wordpress. Я прокручиваю старую таблицу, использую php, чтобы настроить некоторые данные для новой таблицы, а затем выполнить каждую вставку. Однако он будет только вставлять первую строку. Если я снова запустил код, он введет ту же самую первую строку, поэтому я не думаю, что есть проблема с первичным ключом.MySQL вставляет петлю только вставляет одну строку

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); 
+0

Почему вы не используете объект базы данных wordpress '$ wpdb'? http://codex.wordpress.org/Class_Reference/wpdb – Konsole

+0

Возвращает ли запрос '$ getPostID' более одной строки? Поскольку вы извлекаете результаты в цикле, но каждый раз переписываете одну и ту же переменную. – Barmar

+0

Я не знал об этом объекте. Я должен посмотреть на это. Спасибо. –

ответ

3

Я считаю, что из-за этой линии

$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. 

Поскольку вы переназначить $result из SELECT, в результате INSERT. Можете ли вы изменить эту строку только на это?

mysqli_query($con,$sql); 
+0

Или назовем это '$ result3', чтобы вы могли проверить его на успех. – Barmar

+0

@Barmar, правда. Тем не менее, в своем коде он не проверял, успешный ли он, поэтому я просто использую минимальный код. : D – invisal

+0

Значение никогда не используется. Если больше кода не добавляется позже в цикле, в котором используется результат mysqli_query(), его следует изменить на то, что предложил invisal. – Landstander

0

Проблема существует в данный момент:

$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)) запускает второй, извлекает одни и те же данные и продолжает операцию вставки.

P.S. Рассмотрите возможность использования объекта $wpdb для работы базы данных Wordpress http://codex.wordpress.org/Class_Reference/wpdb.

+1

Я собирался опубликовать тот же ответ, но я подозреваю, что этот запрос возвращает только одну строку. Я видел много людей, которые обычно называют 'fetch' в цикле даже для уникальных запросов. Вот почему я спросил об этом выше в комментарии перед публикацией. – Barmar

Смежные вопросы