Вопрос состоит в следующем на сайте есть коментарии выводятся они рекурсией под каждым коментарием есть ответ на него. Проблема состоит в следующем: При нажатии на кнопку ответ появляется модалка в которой и прописывается ответ на комент. После все передается на файл обработчик и заносится в бд. Но я не могу передать id того коментария на который происходит ответ (а это нужно обязательно). Пробовал в рекурсии id присваевать до переменной так тогда в переменную попадает либо первый id либо последний. Других мыслей как это сделать нет. Подскажите как это сделать? Вот здесь можете сами посмотреть как оно работает http://dronboy.esy.es/wiev_post.php?id=8
В тег A можешь добавить data атрибут с id комментария. При срабатывании функции которая ждёт нажатие на ссылку ответить можно обратиться к this переменной, которая будет ссылаться на ту ссылку на которую нажали и из data-id атрибута можно будет получить id комментария.
Так. Поскольку у тебя модальная форма. А она одна, то выходит только JavaScript тебе в помощь. denis01 дал дельный совет
Сделал как ты сказал, работает все так же не правильно. Я сделал еще одно поле к нему в валуе присвоил id его сделал тип text ну что бы видеть где какой id и когда нажимаю отправить всеровно передается не тот id --- Добавлено --- Проблема в том что с js я так сказать плохо его знаю.
Поскольку после заполнения модальной формы ты всё равно обновляешь страницу, то можно и средствами PHP(добавлено : имеется в виду смысл модальной формы в том, что ты динамически обновишь содержимое страницы, и добавленный комментарий появится без обновления страницы). Под кнопкой ты можешь установить ссылку на скрипт с переменной comment_id(которая содержит id комментария, на который отвечают) Код (Text): <a href="otvet.php?comment_id=5"><img src="otvetit.png"></a> Ну а уже в принимающем скрипте otvet.php ты в переменной $_GET['comment_id'] будешь иметь id коммента, который ты хочешь коментить. После работы этого скрипта возвращаешься назад на страницу с комментариями. Эт конечно не изящно, на JavaScript было бы куда лучше
@SpikePHP да не он же говорит что у него первый id тока присваивается.... Меня тут это толкает на мысль что он id вообще не правильно присваивает, то есть выборку из базы как то криво делает.... @Dron-Boy показывай как ты выборку делаешь свою когда комментарии выводишь...
@Dron-Boy чё было расскажи может у других такая же трабла будет, да они зайдут почитают и тебе ещё спасибо потом скажут
Я решил следующим образом (да конечно все не "изящно" но все же): сделал <input type="radio" onclick="ADD_BUTTON(id)" name="add_art" id="btn" value="'.$arr[$parent_id][$i]['id'].'" /> когда я нажимаю на переключатель то id тот что мне нужно. Кликаю на input открывается модалка и отвечаем на комент при этом id все так же хранится в радио кнопке и уходит вместе с ответом) Я же говорил что не "Изящно"))))
@Dron-Boy кинул бы ты код как ты строишь выборку из бд и как ты её в html выводишь, а тебе мб бы тут и готовый код напилинькали, за одно бы с аяксом научился работать, там только на вид страшно и зубы большие, а по головке погладишь он как самая добротная собачка становится словно ты её хозяин которого она не видела пару месяцев.
PHP: <!--Вывод рекурсии коментариев--> <? error_reporting(E_ALL); function get_cat() { if (isset ($_GET["id"])){ $id_z =$_GET["id"]; } //запрос к базе данных $sql = "SELECT * FROM comments WHERE id_zam = $id_z"; $result = mysql_query($sql); if(!$result) { return NULL; } $arr_cat = array(); if(mysql_num_rows($result) != 0) { //В цикле формируем массив for($i = 0; $i < mysql_num_rows($result);$i++) { $row = mysql_fetch_array($result,MYSQL_ASSOC); //Формируем массив, где ключами являются адишники на родительские категории if(empty($arr_cat[$row['parent_id']])) { $arr_cat[$row['parent_id']] = array(); } $arr_cat[$row['parent_id']][] = $row; } //возвращаем массив return $arr_cat; } } function viev_cat($arr,$parent_id = 0){ if(empty($arr [$parent_id])){ return; } if(isset ($_GET['id'])) { $id = $_GET['id'] ; } echo'<ul class="coment"><li>'; for($i = 0; $i< count ($arr[$parent_id]); $i ++){ echo'<div><b>'.$arr[$parent_id][$i]['name'].'</b> <br> <p>'.$arr[$parent_id][$i]['comment'].'</p><span> Дата: '.$arr[$parent_id][$i]['date_add'].' <input type="radio" onclick="ADD_BUTTON(id)" name="add_art" id="btn" value="'.$arr[$parent_id][$i]['id'].'" /> <form method="post" action="otvet_coment.php?id_zam='.$id.'"> '; echo'</span></div>'; viev_cat($arr, $arr[$parent_id][$i]['id']); } echo'</li></ul>'; } $res = get_cat(); viev_cat($res); ?>
@Dron-Boy Вот сейчас короче закомментируй свой код и вставь вот этот вот. А потом скинь сюда что у тебя показало на экране плиз. \ PHP: <?php function getDataParams($host, $dbname, $user, $password, $charset) { // Эта функция служит для возврата массива параметров в бд учись разделять код. Грамотно. // А ещё лучше в будущем освой ООП и перепиши данное на ккласами и объектами, а пока и так норм. return array( 'host' => $host, 'dbname' => $dbname, 'user' => $user, 'password' => $password, 'charset' => $charset ); } ?> <?php function connect($params) { // это функция возвращает твоё подключение к базе данных методом PDO::STATEMENT // Не используй mysql_ функции они уже устарели, и рано или поздно уйдут скоро из поддержки php $dsn = "mysql:host={$params['host']};charset={$params['charset']};dbname={$params['dbname']}"; $db = new \PDO($dsn, $params['user'], $params['password']); return $db; } ?> <?php // Не увидел твоих параметров поэтому напишу произвольные // Надеюсь поймёшь что куда заполнять //теперь мы имеем подключение к базе данных которое хранится в $db и можем спокойно строчить запросы // Так дальше что то тут твоё не понятно ты получаешь так понимаю id из гет запроса какой то if (isset ($_GET["id"])){ // если уж ты делаешь выборку по полученному гету то саму выборку тоже прячь в условие если нету такого гет запроса зачем тебе делать бестолковое подключение к бд :) // А ещё оно может быть с ошибочкой если у тебя будет пустая переменная $id_z будет.... $id_z =$_GET["id"]; $params = getDataParams('localhost', 'db_name', 'user', 'password', 'utf8'); // Ниже вызовим нашу функцию подключения к бд по средставом PDO $db = connect($params); $result = $db->prepare('SELECT * FROM comments WHERE id_zam=:id'); // Это подготавлемый запрос служит для того чтобы в базу // не проникли всякие языческие знаки, но это магия пока сильна поэтому прими как должное что оно просто так должно быть $result->bindParam(':id', $id_z); // присваивание параметров происходит таким образом думаю аналогию проведёшь. $result->execute(); // Ну вот наш запрос готов и pdo метод execute отправляет наш запрос к бд. $result = $result->fetchAll(); // теперь данным методом получаем наш массив из бд :) всё генеально и просто :) echo '<pre>'; print_r($result); echo '</pre>'; } ?> --- Добавлено --- но можешь пока почитать я старался всё прокомментировать.. Но кинь массив, я дальше уже отталкиваясь от него допишу твою задачу --- Добавлено --- @Dron-Boy чувак Ау я дописать хочу твою задачу Але За одно рассказать тебе как грамотно код написать Ладно если я вдруг усну, добйте кто нибудь Помогите ему познать магию php Но что то чувство у меня что он не правильно id вернул, потому что там внизу такая каша... Онполучает id гетом, и возвращает его и забевает им же однотипным его.... Чувак где вывод всех комментариев на странице?
Так смотри if(isset ($_GET['id'])) { $id = $_GET['id'] ; } Эта фукция ловит id заметки который гетом передается на эту страницу. я ее присваеваю два раза раз вверху файла раз здесь. Так как не получается сделать глобальную переменную . Далее подключение к бд идет в другом файле. сдесь только выборка и вывод рекурсии. Да я не спорю код у меня карявый вобще говнокод. Ну пока что лучше не умею извените. Если хочешь мне помочь я буду даже рад очень честно. Я вижу что ты в этом ну намного лучше меня шаришь так может тогда ты мне немного подскажешь или научишь немного как что писать и что учить что бы я знал как правильно делать? За это буду благодарен. И извени что долго не отвечал был сильно занят.
@Dron-Boy у тебя комментарии в базе есть? Где их вывод ? Там id передавай на каждый комментарий тем способом который я тебе скинул вывод в data-id свой уник идентификатор комментария какой тут гет запрос ты о чём?
Да. --- Добавлено --- PHP: <? error_reporting(E_ALL); function get_cat() { if (isset ($_GET["id"])){ $id_z =$_GET["id"]; } //запрос к базе данных $sql = "SELECT * FROM comments WHERE id_zam = $id_z"; $result = mysql_query($sql); if(!$result) { return NULL; } $arr_cat = array(); if(mysql_num_rows($result) != 0) { //В цикле формируем массив for($i = 0; $i < mysql_num_rows($result);$i++) { $row = mysql_fetch_array($result,MYSQL_ASSOC); //Формируем массив, где ключами являются адишники на родительские категории if(empty($arr_cat[$row['parent_id']])) { $arr_cat[$row['parent_id']] = array(); } $arr_cat[$row['parent_id']][] = $row; } //возвращаем массив return $arr_cat; } } function viev_cat($arr,$parent_id = 0){ if(empty($arr [$parent_id])){ return; } echo'<ul class="coment"><li>'; for($i = 0; $i< count ($arr[$parent_id]); $i ++){ echo'<div><b>'.$arr[$parent_id][$i]['name'].'</b> <br> <p>'.$arr[$parent_id][$i]['comment'].'</p><span> Дата: '.$arr[$parent_id][$i]['date_add'].'<input type="button" onclick="ADD_BUTTON(id)" name="add_art" id="btn" value="Ответить" /> '; echo'</span></div>'; //Вот здесь я каждому коментарию присваиваю свой id //Так у меня было изначально. global $id_com; $id_com =$arr[$parent_id][$i]['id']; // viev_cat($arr, $arr[$parent_id][$i]['id']); } echo'</li></ul>'; } $res = get_cat(); viev_cat($res); ?> --- Добавлено --- Это или рекурсия кривая (писал по вот этому уроку http://webformyself.com/vyvod-mnogourovnevogo-menyu-s-neogranichennym-urovnem-vlozhennosti/) или я не знаю. Когда я присваиваю каждому коменту свой Id то передается все ровно либо id первого комента либо последнего. Это ты можешь затестить тут вот http://dronboy.esy.es/wiev_post.php?id=9 по коментируй и сам все увидишь.
PHP: <?php function getDataParams($host, $dbname, $user, $password, $charset) { // Эта функция служит для возврата массива параметров в бд учись разделять код. Грамотно. // А ещё лучше в будущем освой ООП и перепиши данное на ккласами и объектами, а пока и так норм. return array( 'host' => $host, 'new_blog' => $dbname, 'user' => $user, 'password' => $password, 'charset' => $charset ); } ?> <?php function connect($params) { // это функция возвращает твоё подключение к базе данных методом PDO::STATEMENT // Не используй mysql_ функции они уже устарели, и рано или поздно уйдут скоро из поддержки php $dsn = "mysql:host={$params['host']};charset={$params['charset']};dbname={$params['dbname']}"; $db = new \PDO($dsn, $params['user'], $params['password']); return $db; } ?> <?php // Не увидел твоих параметров поэтому напишу произвольные // Надеюсь поймёшь что куда заполнять //теперь мы имеем подключение к базе данных которое хранится в $db и можем спокойно строчить запросы // Так дальше что то тут твоё не понятно ты получаешь так понимаю id из гет запроса какой то if (isset ($_GET["id"])){ // если уж ты делаешь выборку по полученному гету то саму выборку тоже прячь в условие если нету такого гет запроса зачем тебе делать бестолковое подключение к бд :) // А ещё оно может быть с ошибочкой если у тебя будет пустая переменная $id_z будет.... $id_z =$_GET["id"]; $params = getDataParams('localhost', 'new_blog', 'Viktor', '12345', 'utf8'); // Ниже вызовим нашу функцию подключения к бд по средставом PDO $db = connect($params); $result = $db->prepare('SELECT * FROM comments WHERE id_zam=:$id'); // Это подготавлемый запрос служит для того чтобы в базу // не проникли всякие языческие знаки, но это магия пока сильна поэтому прими как должное что оно просто так должно быть $result->bindParam(':id', $id_z); // присваивание параметров происходит таким образом думаю аналогию проведёшь. $result->execute(); // Ну вот наш запрос готов и pdo метод execute отправляет наш запрос к бд. $result = $result->fetchAll(); // теперь данным методом получаем наш массив из бд :) всё генеально и просто :) echo '<pre>'; print_r($result); echo '</pre>'; } ?> Вот скрин он на скрине выводи пустой массив. Если что поля в БД называются name =имя, comment = коментарий, date_add дата
Дебаж воткни вот такую конструкцию PHP: if (empty ($id_z)) {echo 'Привет вася я пустая переменная $id_z';} Я всегда пише себе привет вася когда дебажу php код. Так что как то так. Если у тебя переменная не пуста то выведи её и сделай запрос в mysql и посмотри, есть ли там id такой то --- Добавлено --- и я имел ввиду переписать вывод комментариев по моему образу и подобию кода. --- Добавлено --- всё я спать у меня час ночи завтра на работу приду надеюсь увидеть твой переписанный код по моему образу и подобию, я тебе оставил тут кучу подсказок и всяких магических плюшек
Так смотри я сделал твое подключение и запрос в бд как ты мне скинул вот оно выводит все норм. но ошибка теперь Warning: mysql_num_rows() expects parameter 1 to be resource, array given in C:\OpenServer\domains\new-blog\wiev_post.php on line 201. Почему то в mysql_num_rows нечего не попадает. вот код PHP: <? error_reporting(E_ALL); function get_cat() { function getDataParams($host, $dbname, $user, $password, $charset) { // Эта функция служит для возврата массива параметров в бд учись разделять код. Грамотно. // А ещё лучше в будущем освой ООП и перепиши данное на ккласами и объектами, а пока и так норм. return array( 'host' => $host, 'dbname' => $dbname, 'user' => $user, 'password' => $password, 'charset' => $charset ); } function connect($params) { // это функция возвращает твоё подключение к базе данных методом PDO::STATEMENT // Не используй mysql_ функции они уже устарели, и рано или поздно уйдут скоро из поддержки php $dsn = "mysql:host={$params['host']};charset={$params['charset']};dbname={$params['dbname']}"; $db = new \PDO($dsn, $params['user'], $params['password']); return $db; } // Не увидел твоих параметров поэтому напишу произвольные // Надеюсь поймёшь что куда заполнять //теперь мы имеем подключение к базе данных которое хранится в $db и можем спокойно строчить запросы // Так дальше что то тут твоё не понятно ты получаешь так понимаю id из гет запроса какой то if (isset ($_GET["id"])){ // если уж ты делаешь выборку по полученному гету то саму выборку тоже прячь в условие если нету такого гет запроса зачем тебе делать бестолковое подключение к бд :) // А ещё оно может быть с ошибочкой если у тебя будет пустая переменная $id_z будет.... $id_z =$_GET["id"]; $params = getDataParams('localhost', 'new_blog', 'Viktor', '12345', 'utf8'); // Ниже вызовим нашу функцию подключения к бд по средставом PDO $db = connect($params); $result = $db->prepare('SELECT * FROM comments WHERE id_zam=:id'); // Это подготавлемый запрос служит для того чтобы в базу // не проникли всякие языческие знаки, но это магия пока сильна поэтому прими как должное что оно просто так должно быть $result->bindParam(':id', $id_z); // присваивание параметров происходит таким образом думаю аналогию проведёшь. $result->execute(); // Ну вот наш запрос готов и pdo метод execute отправляет наш запрос к бд. $result = $result->fetchAll(); // теперь данным методом получаем наш массив из бд :) всё генеально и просто :) echo '<pre>'; print_r($result); echo '</pre>'; } $arr_cat = array(); if(mysql_num_rows($result) != 0) { //В цикле формируем массив for($i = 0; $i < mysql_num_rows($result);$i++) { $row = mysql_fetch_array($result,MYSQL_ASSOC); //Формируем массив, где ключами являются адишники на родительские категории if(empty($arr_cat[$row['parent_id']])) { $arr_cat[$row['parent_id']] = array(); } $arr_cat[$row['parent_id']][] = $row; } //возвращаем массив return $arr_cat; } } function viev_cat($arr,$parent_id = 0){ if(empty($arr [$parent_id])){ return; } echo'<ul class="coment"><li>'; for($i = 0; $i< count ($arr[$parent_id]); $i ++){ echo'<div><b>'.$arr[$parent_id][$i]['name'].'</b> <br> <p>'.$arr[$parent_id][$i]['comment'].'</p><span> Дата: '.$arr[$parent_id][$i]['date_add'].'<input type="button" onclick="ADD_BUTTON(id)" name="add_art" id="btn" value="Ответить" /> '; echo'</span></div>'; //Вот здесь я каждому коментарию присваиваю свой id //Так у меня было изначально. global $id_com; $id_com =$arr[$parent_id][$i]['id']; // viev_cat($arr, $arr[$parent_id][$i]['id']); } echo'</li></ul>'; } $res = get_cat(); viev_cat($res); ?>
@Dron-Boy зачем тебе mysql num rows я же тебе написал комментарии чел, ты уже имеешь массив данных из бд бери его, в цикл и выводи свои данные через echo. Зачем ты гоняешь ёлки просто так php машину делаешь какие то не понятные телодвижения ищи всё строки с Id твоего родителя и просто в тупую выводи все выбраные элементы и присваивай им их id в атрибут data-id, ты там какие то конструкции пишешь зачем... Пишу же блин возьми мой пример и поиграйся с ним, посмотри как работает чудо механизм. Там после вообще элементарно щёлкаешь по элементу получаешь в js по attr по средством jquery атрибут data-id свой там делаешь ajax запрос на страницу обработки посылаешь туда пост запрос обрабатываешь его там что нужно и возвращаешь нужный ответ в любом удобном формате хоть сконфигурированную html страницу хоть массив хоть просто переменную, хоть массив данных в формате json что угодно блин. вот тебе ссылка, На смотри всё от начала до конца повторяй за ним всё дюйм в дюйм. И пока до конца не досмотришь и не поймёшь всё дальше не дёргайся как посмотришь всё, зайди на ютуб к нему в плей листы и увидишь там php практика и начни смотреть её, и опять же повторяй пока он пишет и ты пиши, и учи. как всё посмотришь вернись к своей задачи и решишь её за 5 минут.