Доброй ночи, Кодеры В базе две таблицы, количество полей и строк не совпадает. Надо - либо написать 1 объеденный запрос в базу, либо заставить цикл вывести в таблицу данные из двух таблиц. Что сделала: Пыталась и то и это, в итоге сдаюсь. Если у кого то есть мысли умные, жду. PS:Не программист я, просто балуюсь эпизодически, раз в 10 лет. По отдельности все работает, но с выводом в одну таблицу большие проблемы. Код (Text): $sql1=$mi->query("SELECT `name`,`img`,`text` FROM `lunab` WHERE `id` IN (".$n.",".$n1.",".$n2.",".$n3.",".$n4.",".$n5.",".$sum.") ORDER BY RAND()"); $sql2=$mi->query("SELECT `txt` FROM `lunat` ORDER BY `id` DESC"); // Вывод результатов echo '<table border=1>'; while ($row = mysqli_fetch_assoc($sql1) && $row1 = mysqli_fetch_assoc($sql2)) { echo '<tr>'; echo '<td valign=top>Карта '.$row['name'].'<br>'.$row['img'].'</td><td height=330px>'.$row['text'].'</td></tr><tr>'; echo '<td height=330px>'.$row1['txt'].'</td></tr><tr>'; } echo "</table>";
Код (Text): таблица "lunab" 36 записей 1 id Первичный int(10) UNSIGNED AUTO_INCREMENT 2 name varchar(1024) utf8_general_ci 3 img varchar(1024) utf8_general_ci 4 text varchar(1024) utf8_general_ci Код (Text): таблица "lutab" - 7 записей 1 id int(10) UNSIGNED AUTO_INCREMENT 2 txt varchar(1024) utf8_general_ci 1. Получаем данные из формы: день и месяц рождения, складываем день+мес, получаем число. 2. Делаем запрос в базу получаем количество записей кроме полученного числа. 3. Дальше из полученного запроса генерим 6 случайных чисел (возможно эту конструкцию можно привести в короткий цикл) Код (Text): $sql=$mi->query("SELECT COUNT(id) FROM ".$table." WHERE id !=".$sum.""); $count_records = mysqli_fetch_row($sql); $count_records = $count_records[0]; $n= rand(0,$count_records); $n1= rand(0,$count_records); $n2= rand(0,$count_records); $n3= rand(0,$count_records); $n4= rand(0,$count_records); $n5= rand(0,$count_records); И далее делаем уже запрос на вывод.
Требуется уточнение. Таблицы имеют что-то общее? ID например. Или совпадение имен колонок случайны? Было бы понятнее со структурой и примерами значений. По поводу случайных чисел. Они должны быть все разные?
Таблицы общего не имеют. Случайные 6 разных кроме того числа что мы получаем по дате рождения, как пример 12 мая=12+5=$карта личности
Тогда та часть вашего кода, где вы получаете шесть случайных чисел будет работать не совсем так, как вам нужно. Ладно. Подумаю над вашей задачей. Чуть позже дам решение.
В общем рассмотрев возможность всё сделать одним запросом, решено от такого решения отказаться. Ввиду излишней длины запроса. Следующий запрос выдаст все возможные соединения строк обеих таблиц в случайном порядке. Код (Text): SELECT `lunab`.*, `lutab`.* FROM `lunab` , `lutab` WHERE lunab.`id` !=17 ORDER BY RAND() Осталось отфильтровать их необходимое количество в отдельный массив. Справитесь?
Честно говоря не делала такого раньше, но попытаюсь найти как это сделать. Поняла, что 2 таблицу чтобы не сортировать, ей нужно переназначить id ключи, дабы ее вообще не сортировать. Правильно ли я понимаю сам запрос: Мы выбираем все из обеих таблиц с условием кроме переменной которая к нам пришла из сложения дата+месяц и сортируем.
Правильно. Создайте пустой массив и обрабатывая выборку, подсчитывайте в нем количество элементов. Одновременно сравнивая строку на соответствие требованию. Если соответствует, то заносите в массив. Предварительно проверив отсутствие этого ID в нем, если есть - пропускайте строку.. Как только массив заполнится прерывайте цикл.
Добр! Дальше объявления пустого массива дело не пошло. Код (Text): $sql1=$mi->query("SELECT `lunab`.`name`,`lunab`.`img`,`lunab`.`text`, `lunat`.`txt` FROM `lunab`,`lunat` WHERE lunab.`id`=".$sum." ORDER BY RAND()"); $keyArray=array(); function array_fill_keys($keyArray, $sql1) { if(is_array($keyArray)) { foreach($keyArray as $key => $value) { $filledArray[$value] = $sql1[$key]; } } return $filledArray; }
Я вообще задумалась над тем, а правильно ли я задачу поставила, смысл выводить 7 позиций, если нужна одна из 7 и комментарий к ней, но комментарий должен быть исходя из того в какой из 7 позиций выпала карта бизнесмена. Пыталась себе упростить задачу, воспользовавшись только запросом в базу соединенных двух таблиц, но то из одной таблицы появлялось куча дублей из-за того что не было связки в ИД, потом вроде добилась правильного вывода из 1 таблицы, а из второй печатается только одна запись. Вроде задача простая, а не получается. Код (Text): $sql1=$mi->query("SELECT `lunab`.`name`,`lunab`.`img`,`lunab`.`text`, `lunat`.`txt` FROM `lunab`,`lunat` WHERE `lunab`.`id` IN (".$n.",".$n1.",".$n2.",".$n3.",".$n4.",".$n5.",".$sum.")= `lunat`.`id` GROUP BY `lunab`.`id`"); echo '<table border=1>'; while ($row = mysqli_fetch_assoc($sql1)) { echo '<tr>'; echo '<td><b>Карта '.$row['name'].'</b></td>'; echo '</tr>'; echo '<tr>'; echo '<td valign=top>'.$row['img'].'</td><td><b>'.$row['text'].'</b><br>'.$row['txt'].'</td></tr><tr>'; } echo '</table>'; Причем попытка чтения ни к чему кроме каши в голове не приводит. Надо как-то упростить задачу, чтобы я могла это понять и сделать сама.
Я не тороплю. Пока вот фильтр для предыдущего запроса PHP: $cntrl = array(); echo '<table border=1>'; while ($row = mysqli_fetch_assoc($sql1)) { if(count($cntrl) > 6) break; if(!in_array($row['id'], $cntrl)) { $cntrl[] = $row['id']; echo '<tr>'; echo '<td><b>Карта '.$row['name'].'</b></td>'; echo '</tr>'; echo '<tr>'; echo '<td valign=top>'.$row['img'].'</td><td><b>'.$row['text'].'</b><br>'.$row['txt'].'</td></tr><tr>'; } } echo '</table>'; Только добавьте в SELECT `lunab`.`id`
Спасибо вам в любом случае! Сейчас все выводится, дублей нет, но теряется то что приходит из формы. И выборка из второй таблицы должна выводится как она есть от 1 до 7 без рандома. Соответственно если я пока просто вас копирую, толку от меня нет. Код (Text): <? if (isset($_POST['num1']) && isset($_POST['num2'])){ $num1=($_POST['num1']);//день рождения $num2=$_POST['num2'];//месяц рождения $sum=$num1+$num2;//складываем день и месяц //echo $sum;//если полученное больше заданного $total=36;//Заданное число if ($sum<=$total){ echo "<table><tr><td>Карта личности - $sum</td></tr></table>"; } else if ($sum>$total){ while (1) { $sum -= $total; if ( $sum > 0 && $sum < 37 ) { break; } } $sum = sprintf($sum); echo "<table><tr><td>Карта личности - $sum</td></tr></table>";//то что пришло нам из формы и то что теряется в итоге } echo "</td></tr><tr><td valign=top>";//дальше вывод в котором мне нужно обязательно разобраться как оно работает, чтобы я могла его изменять, а не отвлекать вас. $sql1=$mi->query("SELECT `lunab`.*, `lunat`.* FROM `lunab` , `lunat` WHERE lunab.`id` !=".$sum." ORDER BY RAND()"); $cntrl = array(); echo '<table border=1>'; while ($row = mysqli_fetch_assoc($sql1)) { if(count($cntrl) > 6) break; if(!in_array($row['id'], $cntrl)) { $cntrl[] = $row['id']; echo '<tr>'; echo '<td><b>Карта '.$row['name'].'</b></td>'; echo '</tr>'; echo '<tr>'; echo '<td valign=top>'.$row['img'].'</td><td><b>'.$row['text'].'</b><br>'.$row['txt'].'</td></tr><tr>'; } } echo '</table>'; } ?>
Выборка из lunat в ней 7 строк, которые должны выводится от 1 до 7 в неизменном виде, сейчас выводится рандомом. С выборкой и выводом из lunab все отлично, но карта личности не выводится на экран вообще. т.е. карта личности которая приходит из формы должна оказаться в выборке в любом поле из 7 карт. Посмотреть тут: https://isida.online/tes1.php
Код (Text): $cntrl = array();//создаем пустой массив echo '<table border=1>'; while ($row = mysqli_fetch_assoc($sql1)) { if(count($cntrl) > 6) break;//count — Подсчитывает количество элементов массива, если массив больше 6 то останавливаем выборку if(!in_array($row['id'], $cntrl))//in_array -- Проверяем, присутствует ли в массиве значение по id то что пришло из базы, и то чем мы наполнили { $cntrl[] = $row['id'];//наполненный массив теперь будет равен тем значениям которые мы получили из базы - дальше вывод echo '<tr>'; echo '<td><b>Карта '.$row['name'].'</b></td>'; echo '</tr>'; echo '<tr>'; echo '<td valign=top>'.$row['img'].'</td><td><b>'.$row['text'].'</b><br>'.$row['txt'].'</td></tr><tr>'; } } echo '</table>'; Мы в запросе просили выбрать все значения из базы кроме значения $sum (то что приходит из формы, чтобы оно не попалось), теперь ее каким то волшебным способом надо добавить в вывод на экран, причем перемешать с остальными полученными и вывести из 2 таблицы согласно id jn 1-7.
PHP: <?php $link = mysqli_connect("bd_host", "user", "password", "db_name"); mysqli_set_charset($link, 'utf8'); $sql = "SELECT `lunab`.*, `lunat`.`id` AS `tid`, `lunat`.`txt` FROM `lunab` , `lunat` ORDER BY RAND()"; $sum = 17; // сумма чисел из формы $cntrl = array(); $cntrl2 = array(); $bd_result = array(); $bd_append = array(); if ($query_result = mysqli_query($link, $sql)) { while ($row = mysqli_fetch_assoc($query_result)) { if($row['id'] != $sum && !in_array($row['id'], $cntrl) && !in_array($row['tid'], $cntrl2) && count($cntrl) < 6) { $cntrl[] = $row['id']; $cntrl2[] = $row['tid']; $bd_result[] = $row; } if($row['id'] == $sum) { $bd_append[] = $row; } } } foreach($bd_append as $result_append) { if(!in_array($result_append['tid'], $cntrl2)) $bd_result[] = $result_append; } shuffle($bd_result); echo '<pre>'; print_r($bd_result); ?>
Если нужно к ним обратиться например. Или объединить, для таблиц. В вашем случае, если второй колонке не дать псевдоним, она заместит первую при извлечении из объекта в ассоциативный массив..