Я неоднократно использовал форму и страницу сохранения, чтобы сохранить ответы пользователей в моей базе данных SQL. Первоначально я сохранял ответы в массив, и как только цель была достигнута, я использовал цикл, чтобы передать все значения массива в базу данных, код страницы обновления выглядел так:
unset($_SESSION['myanswers']);
$_SESSION['myanswers'] = array();
$_SESSION['myanswers']=array(
"File"=>$_POST['file'],
"Rating"=>$_POST['like'],
"Repetitions"=>$_SESSION['reps'],
"degradation"=>$_POST['degradation']
);
$f1=$_SESSION['myanswers']['File'];
$r1=$_SESSION['myanswers']['Rating'];
$r2=$_SESSION['myanswers']['Repetitions'];
$the_id=$_SESSION['user_id'];
$the_deg=$_SESSION['myanswers']['degradation'];
array_push($_SESSION['answers'], $_SESSION['myanswers']);
if($_SESSION['counter']==goal){
require 'connect.php';
foreach( $_SESSION['answers'] as $key => $obj)
{
$f1=$obj['File'];
$r1=$obj['Rating'];
$r2=$obj['Repetitions'];
$the_id=$_SESSION['user_id'];
$the_deg=$obj['degradation'];
$sql = "INSERT INTO `array`(`id`, `file`, `rating`, `repetitions`, `degredation`) VALUES ('$the_id', '$f1', '$r1', '$r2', '$the_deg')";
mysql_query($sql);
}
header("Location: MyEndPage");
die();
}else{
header("Location: MyFormPage");
die();
}
Этот код работал нормально, но тогда мне нужно было сохранить все ответы сразу, а не тогда, когда цель была достигнута. Поэтому я изменил код на следующее:
unset($_SESSION['myanswers']);
$_SESSION['myanswers'] = array();
$_SESSION['myanswers']=array(
"File"=>$_POST['file'],
"Rating"=>$_POST['like'],
"Repetitions"=>$_SESSION['reps'],
"degradation"=>$_POST['degradation']
);
$f1=$_SESSION['myanswers']['File'];
$r1=$_SESSION['myanswers']['Rating'];
$r2=$_SESSION['myanswers']['Repetitions'];
$the_id=$_SESSION['user_id'];
$the_deg=$_SESSION['myanswers']['degradation'];
require 'connect.php';
$sql = "INSERT INTO `array`(`id`, `file`, `rating`, `repetitions`, `degredation`) VALUES ('$the_id', '$f1', '$r1', '$r2', '$the_deg')";
mysql_query($sql);
if($_SESSION['counter']==goal){
header("Location: MyEndPage");
die();
}else{
header("Location: MyFormPage");
die();
}
Это когда проблема появилась, новые записи сохраняются всегда в том же месте, между старыми и новыми данными. Например, если до изменения я сохранил 5 записей, их порядок в массиве sql будет таким:
1, имя1, данные1
2, имя2, данные2
3, имя3, данные3
4, имя4, данные4
5, имя5, данные5
Добавление многократно новых записей с новым кодом было проблематичным, если, например, мы добавляем записи 6,7,8, они добавляются следующим образом:
1, имя1, данные1 | 1, имя1, данные1 | 1, имя1, данные1
2, имя2, данные2 | 2, имя2, данные2 | 2, имя2, данные2
3, имя3, данные3 | 3, имя3, данные3 | 3, имя3, данные3
4, имя4, данные4 | 4, имя4, данные4 | 4, имя4, данные4
5, имя5, данные6 | 5, имя5, данные6 | 5, имя5, данные6
6, имя6, данные5 | 7, имя7, данные7 | 8, имя8, данные8
——————— | 6, имя6, данные6 | 7, имя7, данные5
——————— | ——————— | 6, имя6, данные6
По какой-то причине вставка в не идет в конец массива sql, а является стеком в конце данных, собранных со старым кодом. Я попробовал некоторые изменения в коде, но ничего не получалось.
Базы данных не обязательно хранят новые записи в конце таблицы. Они также могут повторно использовать пространство, которое было освобождено предыдущим удалением.
Кроме того, порядок может показаться случайным по любой причине. Особенно, когда вы фильтруете (где предложение) или присоединяетесь к другим таблицам, это может повлиять на порядок, поскольку MySQL использует определенные индексы для фильтрации или объединения и часто возвращает фактические данные в этом порядке.
Независимо от причины, если вы запрашиваете данные, вы можете получить эти данные в произвольном порядке. Если вам нужна информация в определенном порядке, примените этот порядок, добавив ORDER BY
пункт к вашему запросу.
Других решений пока нет …