[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: SQL, WordPress, USER table
Joliat
Добрый день.
Мне нужно из БД движка WordPress вывести имя последнего и предпоследнего пользователя оставившего комментарий к посту. Они должны быть в разных переменных, чтоб можно было сравнивать If'ом.

Использую код:

$last_nam_comm=intval($wpdb->get_var("SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_post_ID = '$id'"));
echo $last_nam_comm; // Вывод номера последнего комментария в данном посте


$last_autor = $wpdb->get_var("SELECT comment_author FROM $wpdb->comments WHERE comment_post_ID = '$id' AND comment_ID='$last_nam_comm'" );
echo $last_autor; // Вывод автора последнего комментария

$last_nam_comm2=$last_nam_comm-1;

$last_autor2 = $wpdb->get_var("SELECT comment_author FROM $wpdb->comments WHERE comment_post_ID = '$id' AND comment_ID='$last_nam_comm2'");
echo $last_autor2; // Вывод автора предпоследнего комментария


Вывод номера происходит без проблем, а вот имена не выводятся.
Думаю, что AND написан не верно. Я пытаюсь взять имя автора под номером $last_nam_comm и $last_nam_comm2, но условия AND просто ищет поле с такими значениями.

Как выйти из данной ситуации? Спасибо!



Спустя 3 часа, 3 минуты, 7 секунд (14.09.2011 - 12:21) crash написал(а):
Все делается намного проще
Приблизительно так

//берем кол-во комментов всего
$count=intval($wpdb->get_var("SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_post_ID = '$id'"));

//получаем двух последних юзеров
$users = $wpdb->get_results("SELECT `comment_author` FROM $wpdb->comments WHERE comment_post_ID = '$id' LIMIT ".($count-2).", 2");
var_dump($users);

ну и понятное дело, вставляем проверки, на кол-во комментариев. Нужно чтобы их было больше 2 иначе mysql выдаст ошибку.

Спустя 15 минут, 7 секунд (14.09.2011 - 12:36) Joliat написал(а):
а как теперь их присвоить разным переменным?

Спустя 6 минут, 48 секунд (14.09.2011 - 12:43) crash написал(а):
а зачем разным присваивать? $users и так будет массивом, так что можно его использовать для проверок.

Спустя 3 минуты, 3 секунды (14.09.2011 - 12:46) Joliat написал(а):
ну мне нужно сделать проверку. Если имена этих двух авторов одинаковы, то к предпоследнему сообщению дописывается последнее с пометкой о времени, а последнее соответственно после этого удаляется.

Спустя 7 минут, 48 секунд (14.09.2011 - 12:54) crash написал(а):
а разве элемента массива нельзя друг с другом сравнивать?
Тем более что их будет всего два.

if($users[0]->comment_author==$users[1]->comment_author){
echo 'Юзеры одинаковы!';
}else{
echo 'Юзеры разные!';
}

такой код работает вполне корректно.

Спустя 4 минуты, 48 секунд (14.09.2011 - 12:58) Joliat написал(а):
ухты как просто!)))
Я же пишу, что начинающий!
у меня эта процедура выглядит так:

$last_nam_comm=intval($wpdb->get_var("SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_post_ID = '$id'"));
echo $last_nam_comm.' - номер последнего комментария в данном посте<br/>'; // Вывод номера последнего комментария в данном посте


$last_autors = $wpdb->get_results("SELECT comment_author FROM $wpdb->comments WHERE comment_post_ID = '$id' ORDER BY comment_date DESC LIMIT 2");
foreach ($last_autors as $last_autors2) {
$last_autors_list .= $last_autors2->comment_author.'_cutit_';
}
$dva_avtora=substr($last_autors_list, 0, -7);
print $dva_avtora.'<br/>';

$pos_autor = strpos($dva_avtora, '_cutit_'); // Ищем позицию символов "_cutit_" в переменной $dva_avtora
$last_autor = substr($dva_avtora, 0, $pos_autor); // Обрезаем конец переменной с учетом (_cutit_)
echo $last_autor.' - автор последнего сообщения<br/>';
$pre_last_autor = substr($dva_avtora, $pos_autor+7); // Обрезаем начало переменной с учетом 7ти символов (_cutit_)
echo $pre_last_autor.' - автор предпоследнего сообщения<br/>';

if ($last_autor == $pre_last_autor) //Сравнение имени пользователя с автором последнего сообщения
{


Еще, если не сложно, есть вопрос: Как произвести правильно запись в предпоследнее сообщение последнего? без лишнего гемороя, как у меня выходит!)))

Спустя 12 минут, 53 секунды (14.09.2011 - 13:11) crash написал(а):
Принцип прост. Вытаскиваешь предпоследнее сообщение, с помощью LIMIT, редактируешь его и сохраняешь в таблицу. У wpdb есть даже специальный метод для обновления записей.

Спустя 30 секунд (14.09.2011 - 13:12) Joliat написал(а):
кстати, при Вашем коде :

//берем кол-во комментов всего
$count=intval($wpdb->get_var("SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_post_ID = '$id'"));

//
получаем двух последних юзеров
$users = $wpdb->get_results("SELECT `comment_author` FROM $wpdb->comments WHERE comment_post_ID = '$id' LIMIT ".($count-2).", 2");
var_dump($users);

if($users[0]->comment_author==$users[1]->comment_author){
echo 'одинаковы';
}

появляется надпись:
array(2) { [0]=> object(stdClass)#5004 (1) { ["comment_author"]=> string(5) "admin" } [1]=> object(stdClass)#4996 (1) { ["comment_author"]=> string(6) "Bandit" } }
и условие не работает! :unsure:

Спустя 7 минут, 59 секунд (14.09.2011 - 13:20) Joliat написал(а):
Как я понимаю код для вытаксивания предпоследнего сообщения выглядит так:
$pred_msg= $wpdb->get_results("SELECT `comment_content` FROM $wpdb->comments WHERE comment_post_ID = '$id' LIMIT ".($count-2).", 1");
var_dump($pred_msg);
echo $pred_msg[0]->comment_content;

верно?

Спустя 23 минуты, 31 секунда (14.09.2011 - 13:43) crash написал(а):
Цитата
появляется надпись:

var_dump($users); убери, чтобы надпись не появлялась.
А что выводит? Что одинаковы?

Цитата
Как я понимаю код для вытаксивания предпоследнего сообщения выглядит так:

да, только $count сначала получи, как в предыдущем примере.

Спустя 15 минут, 15 секунд (14.09.2011 - 13:59) Joliat написал(а):
var_dump($users); - уже убрал!))
условие заработало только после вывода переменных
echo $users[0]->comment_author.'<br/>';
echo $users[1]->comment_author.'<br/>';
Также получилось вывести предпоследнее и последнее сообщение в посте.

Возникли трудности с перезаписью. нарыл такой пример. что тут нужно вставлять моего? если предпоследнее сообщение $pred_msg[0]->comment_content;, а последнее $pred_msg[1]->comment_content;


$wpdb->update( 'table',
array( 'column1' => 'value1', 'column2' => 'value2' ),
array( 'ID' => 1 ),
array( '%s', '%d' ),
array( '%d' )
)


Спустя 1 час, 11 минут, 31 секунда (14.09.2011 - 15:10) crash написал(а):
ну тут все просто
'table' - это имя таблицы, в которую вставляешь.
array( 'column1' => 'value1') - это список столбцов и значений, которые обновляешь.'column1' - это имя столбца, 'value1' - это значение столбца.
array( 'ID' => 1 ) - это условие WHERE
Остальные можно не использовать.

Спустя 7 минут, 35 секунд (14.09.2011 - 15:18) Joliat написал(а):
а как обойтись без array, ведь у меня только одну ячейку нужно переписать?

Спустя 53 минуты, 51 секунда (14.09.2011 - 16:11) Joliat написал(а):
код:
$wpdb->update( $wpdb->comments, array( 'comment_content' => $new_msg ),array( 'comment_post_ID' => $id ) ); 

обновил все комментарии в посту. подскажите пожалуйста как прописать LIMIT или правильно задать команду!

Спустя 54 минуты, 28 секунд (14.09.2011 - 17:06) Joliat написал(а):
Дошел до такого кода:
$wpdb->query("UPDATE $wpdb->comments SET comment_content = '$new_msg' WHERE comment_post_ID = '$id'LIMIT 1"); 

Он действительно заменяет только одну ячейку, но она является ячейкой первого комментария, а не последнего! ORDER BY не помогает,а может не правильно его пишу!((
Подскажите, что делать!

Спустя 6 минут, 15 секунд (14.09.2011 - 17:12) crash написал(а):
когда получаешь сообщение для редактирования, то бери также поле comment_ID. По нему и обновляй запись.

Спустя 9 минут, 43 секунды (14.09.2011 - 17:22) Joliat написал(а):
				$pred_msg= $wpdb->get_results("SELECT 'comment_content' AND 'comment_ID' FROM $wpdb->comments WHERE comment_post_ID = '$id' ORDER BY comment_date ASC LIMIT ".($last_nam_comm-2).", 2");
echo $pred_msg[0]->comment_ID;
echo $pred_msg[0]->comment_content;
echo $pred_msg[1]->comment_content;

SELECT прописывается через "," или AND? у меня почему-то нитак-нитак не работает!

Спустя 22 минуты (14.09.2011 - 17:44) crash написал(а):
через запятую
Кроме того, имена полей нужно брать в апострофы (знак `), а не в кавычки.


_____________
О-о-о-о-о-очень начинающий...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.