#php #mysql #arrays #insert #fetch
#php #mysql #массивы #вставить #выборка
Вопрос:
Я пытаюсь создать функцию для системы Mybb, которая будет называть это социальными группами, пока это было здорово, но когда я пытаюсь вставить комментарий в базу данных, он вставляет его дважды из-за msql_fetch_array и того, как это работает (php должен это исправить)
В любом случае, как я могу получить идентификатор сообщений, которые пользователь комментирует, и вставить его только один раз в базу данных, а не дважды
<?php
require_once ("core/connection.php");
require_once ("core/group_functions.php");
//We need to post the message update in to the database
if(isset($_POST['post_message_submit'])) {
$post_message_submit = $_POST['post_message_submit'];
$post_message = $_POST['post_message'];
if(($post_message_submit) amp;amp; ($post_message)) {
$insert_query = $db->query("INSERT INTO " . TABLE_PREFIX . "groups_posts" . "(posted_by, group_name, post_body)
VALUES ('$mybb_username', '$get_group_url' ,'$post_message')");
} else {
echo "<text style='color:red;'> You Must Specify A Message</a></text>";
}
}
echo "
<form action='' method='POST'>
<textarea name='post_message' id='post_message' placeholder='Whats Going On?'></textarea><br>
<input type='submit' name='post_message_submit' value='Post'>
</form>
";
$fetch_index_query = $db->query("SELECT post_id,posted_by,post_body,post_active,group_name FROM " . TABLE_PREFIX . "groups_posts WHERE group_name='$get_group_url'");
while($fetch_index_groups_array = $db->fetch_array($fetch_index_query)) {
$post_id_row = $fetch_index_groups_array['post_id'];
$posted_by = $fetch_index_groups_array['posted_by'];
$g_name = $_fetch_index_groups_array['g_name'];
$g_body = $fetch_index_groups_array['post_body'];
echo("<br>" . "<a href=''> $posted_by </a>" . "<br>" . $gname
. "<br>____________
<br>
<form action='' method='POST'>
<input type='text' name='comment_post' placeholder='Comment then Hit Enter'>
</form>
"
);
$fetch_comments_query = $db->query("SELECT g_name,post_body,comment_by FROM spud_groups_comments WHERE post_id='$post_id_row'");
while($fetch_groups_comments = $db->fetch_array($fetch_comments_query)) {
$post_body = $fetch_groups_comments['post_body'];
echo ("<br>" . $post_body);
}
$insert_query = $db->query("INSERT INTO " . TABLE_PREFIX . "groups_posts" . "(posted_by, group_name, post_body)
VALUES ('$mybb_username', '$get_group_url' ,'$post_message')");
}
//We have done everything we need to do we can now exit and not execute anything beyond this point
exit();
?>
Это программное обеспечение будет с открытым исходным кодом, так что вы действительно вносите свой вклад в эту функцию, помогая, поскольку я никогда раньше не продвигался так далеко.
Спасибо!
Комментарии:
1. Что такое объект $ db? Он случайно справляется только с одним набором результатов?
2. Это программный объект форума mybb, он просто заменяет MySQL на db
3. Вы выполняете цикл вокруг $fetch_index_query и для каждой возвращаемой строки выполняете вставку. Ничто во вставке не зависит ни от чего из $fetch_index_query, поэтому, похоже, нет смысла помещать вставку в цикл. Но способ, которым ваш код широко открыт для атак с использованием SQL-инъекций.
Ответ №1:
потому что вы используете запрос вставки дважды 🙂
Комментарии:
1. Я забыл упомянуть, что, лол, я дважды вставлял запрос в целях тестирования, но у него был другой запрос для вставки комментария, но по какой-то причине fetch_array вставляет его в базу данных из того, сколько комментариев было найдено (скажем, если найдено 4 сообщения, он вставит комментарий в базу данных 4 раза)
2. не говорите, что fetch_array вставляет его, на самом деле вы отправляете форму на той же странице, и php-скрипт может снова запуститься после отправки формы. Итак, попробуйте создать файлы и модуль вашего проекта
3. Я могу попробовать, но я извлек запрос вставки из fetch_array, и он вставлен только один раз, но мне нужно с в массиве выборки, чтобы получить row_id
4. В качестве хорошего предложения: никогда не создавайте динамические формы. Не пытайтесь включить HTML в php. На самом деле это плохая практика. используйте html и php и по возможности отдельно.
5. я делаю это только в целях тестирования, но скоро я их разделю
Ответ №2:
<?php
require_once ("core/connection.php");
require_once ("core/group_functions.php");
//We need to post the message update in to the database
if(isset($_POST['post_message_submit'])) {
$post_message_submit = $_POST['post_message_submit'];
$post_message = $_POST['post_message'];
if(($post_message_submit) amp;amp; ($post_message)) {
// $insert_query = $db->query("INSERT INTO " . TABLE_PREFIX . "groups_posts" . "(posted_by, group_name, post_body) VALUES ('$mybb_username', '$get_group_url' ,'$post_message')");
} else {
echo "<text style='color:red;'> You Must Specify A Message</a></text>";
}
}
echo "
<form action='' method='POST'>
<textarea name='post_message' id='post_message' placeholder='Whats Going On?'></textarea><br>
<input type='submit' name='post_message_submit' value='Post'>
</form>
";
$fetch_index_query = $db->query("SELECT post_id,posted_by,post_body,post_active,group_name FROM " . TABLE_PREFIX . "groups_posts WHERE group_name='$get_group_url'");
while($fetch_index_groups_array = $db->fetch_array($fetch_index_query)) {
$post_id_row = $fetch_index_groups_array['post_id'];
$posted_by = $fetch_index_groups_array['posted_by'];
$g_name = $_fetch_index_groups_array['g_name'];
$g_body = $fetch_index_groups_array['post_body'];
echo("<br>" . "<a href=''> $posted_by </a>" . "<br>" . $gname
. "<br>____________
<br>
<form action='' method='POST'>
<input type='text' name='comment_post' placeholder='Comment then Hit Enter'>
</form>
"
);
$fetch_comments_query = $db->query("SELECT g_name,post_body,comment_by FROM spud_groups_comments WHERE post_id='$post_id_row'");
while($fetch_groups_comments = $db->fetch_array($fetch_comments_query)) {
$post_body = $fetch_groups_comments['post_body'];
echo ("<br>" . $post_body);
}
$insert_query = $db->query("INSERT INTO " . TABLE_PREFIX . "groups_posts" . "(posted_by, group_name, post_body)
VALUES ('$mybb_username', '$get_group_url' ,'$post_message')");
}
//We have done everything we need to do we can now exit and not execute anything beyond this point
exit();
?>
Комментарии:
1. Я забыл упомянуть, что, лол, я дважды вставлял запрос в целях тестирования, но у него был другой запрос для вставки комментария, но по какой-то причине fetch_array вставляет его в базу данных из того, сколько комментариев было найдено (скажем, если найдено 4 сообщения, он вставит комментарий в базу данных 4 раза) Спасибо за попытку до сих пор;)
Ответ №3:
Удалите второй запрос вставки из кода.