За последние 24 часа нас посетили 21678 программистов и 1035 роботов. Сейчас ищут 715 программистов ...

Помогите решить проблему: php и MySQL

Тема в разделе "PHP для новичков", создана пользователем Ondottr, 3 авг 2018.

Метки:
  1. Ondottr

    Ondottr Новичок

    С нами с:
    24 ноя 2017
    Сообщения:
    46
    Симпатии:
    5
    PHP:
    1.        
    2. public function showMap($mysqli, $userData, $resorcesCityes)
    3.         {
    4.             $this->getStartEnd(); // Узнаем координаты(x, y) верхнего левого и правого нижнего улов
    5.             $this->zoom($userData); // Узнаем размеры картинок
    6.             $this->mapControls($userData); // Выводим кнопки навигации
    7.             echo '<table cellspacing="0" cellpadding="0">
    8.            <tbody>
    9.                <tr>
    10.                    <td class="m"></td>';
    11.             for($num = $this->startX; $num <= $this->endX; $num++) {
    12.                 echo '
    13.                        <td class="m">
    14.                            ', $num, '
    15.                        </td>'; // Выводит координаты X в ряд
    16.             }
    17.             echo '</tr>';
    18.             $check = $mysqli->query("SHOW TABLES LIKE '{$userData->row['login']}'"); // Проверяем есть ли таблица засвеченнных участков карты в этого пользователя
    19.             if($check->num_rows == 0) {
    20.                 require_once('includes/table.php'); // Если нету - создаем
    21.             }
    22.             for($num = $this->startY; $num <= $this->endY; $num++) {
    23.                 echo '<tr>
    24.                    <td class="m">';
    25.                 echo $num; // Выводит Y
    26.                 echo '</td>';
    27.                 $result = $mysqli->query("SELECT * FROM `map` WHERE (`x` BETWEEN '{$this->startX}' AND '{$this->endX}') AND `y` = '{$num}'"); // Достаем из БД ряд клеток карты
    28.                 while($map = $result->fetch_array(MYSQLI_ASSOC)) {
    29.                     if(!isset($_SESSION['map_num'])) {
    30.                         $_SESSION['map_num'] = 1;
    31.                         $one = $map['id']; // Id левого верхнего угла
    32.                         $two = $one + (600 * ($this->cells - 1)) + ($this->cells - 1); // Правого нижнего
    33.                         $result = $mysqli->query("SELECT * FROM `{$userData->row['login']}` WHERE `loc_id` BETWEEN '{$one}' AND '{$two}'"); // Достаем из таблицы засвеченных участков карты id клеток от левого вернего угла до правого нижнего
    34.                         while($check = $result->fetch_array(MYSQLI_ASSOC)) {
    35.                             $loc_id[] = $check['loc_id']; // Сохраняем в массив все засвеченные клетки
    36.                         }
    37.                     }
    38.                     if($map['city'] == 0) { // Если на клетке нет города
    39.                         $city = $_GET['selected_city'];
    40.                     }else { // Если есть
    41.                         if(in_array($map['city'], $resorcesCityes->id)) { // Если это город игрока
    42.                             $city = $map['city'];
    43.                         }else {
    44.                             $city = $_GET['selected_city'];
    45.                         }
    46.                     }  
    47.             echo '
    48.            <td>
    49.            <a class="lnk" href="?q=location&id_location=', $map['id'], '&selected_city=', $city, '">
    50.            <img class="map-locs" src="';
    51.             if(!in_array($map['id'], $loc_id)) {
    52.                 echo $map['image'];
    53.             }else{
    54.                 echo $map['imag_l'];
    55.             }
    56.             echo '" ', $this->widthHeight,' title="[', $map['x'], ';', $map['y'],'] ', $map['name'],'">';
    57.             echo '        </a>
    58.                            </td>';
    59.                 }
    60.                 echo '</tr>
    61.            ';
    62.             }
    63.             unset($_SESSION['map_num']);
    64.             echo '
    65.                    </tbody>
    66.                </table>';
    67.             $this->naw($mysqli); // Подключаем навигацию и миникарту
    68.             echo '</div>';
    69.         }
    ну и проблема:
    в первом ряду выводится первая картинка, а остальные, не выводятся совсем
    скрин: https://drive.google.com/open?id=1iJcSZQRWW9XKEi2djTzBTfxUzXMGXOj7
     
    #1 Ondottr, 3 авг 2018
    Последнее редактирование: 3 авг 2018
  2. Ondottr

    Ondottr Новичок

    С нами с:
    24 ноя 2017
    Сообщения:
    46
    Симпатии:
    5
    Вопрос снят
    PHP:
    1. if(!isset($_SESSION['map_num'])) {
    2.                     if($check->num_rows == 0) {
    3.                         require_once('includes/table.php'); // Если нету - создаем
    4.                     }
    5.                     $result = $mysqli->query("SELECT * FROM `map` WHERE (`x` BETWEEN '{$this->startX}' AND '{$this->endX}') AND `y` = '{$num}'"); // Достаем из БД ряд клеток карты
    6.                     $map = $result->fetch_array(MYSQLI_ASSOC);
    7.                     $_SESSION['map_num'] = 1;
    8.                     $one = $map['id']; // Id левого верхнего угла
    9.                     $two = $one + (600 * ($this->cells - 1)) + ($this->cells - 1); // Правого нижнего
    10.  
    11.                     $result = $mysqli->query("SELECT * FROM `{$userData->row['login']}` WHERE `loc_id` BETWEEN '{$one}' AND '{$two}'"); // Достаем из таблицы засвеченных участков карты id клеток от левого вернего угла до правого нижнего
    12.                     while($check = $result->fetch_array(MYSQLI_ASSOC)) {
    13.                         $loc_id[] = $check['loc_id']; // Сохраняем в массив все засвеченные клетки
    14.                     }
    15.  
    16.                 }
    Вынес условие из цикла while, добавил еще один запрос и все почему то заработало...
     
  3. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.825
    Симпатии:
    738
    Адрес:
    Татарстан
    реально, для каждого пользователя - своя таблица??? а если их пару тысяч?
     
  4. Ondottr

    Ondottr Новичок

    С нами с:
    24 ноя 2017
    Сообщения:
    46
    Симпатии:
    5
    А если это будет в одной таблице, то там может быть до 180 миллионов строк, разве не лучше разделить по таблицам?

    Незнаю как сделать по другому..
     
  5. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.825
    Симпатии:
    738
    Адрес:
    Татарстан
    похоже отсюда и растут ноги ))))
    ну обычно под каждого пользователя не делают отдельные таблицы...
    все в одной таблице - это облегчает дальнейшую работу....
    вот у вас даже 100 пользователей - - какой SQL будет - чтоб найти например нужного пользователя? сверить логин пароль?
    а если в оной таблице - все легко и просто
    Код (Text):
    1. SELECT * FROM T WHERE login='login' && password ='password'
     
  6. Ondottr

    Ondottr Новичок

    С нами с:
    24 ноя 2017
    Сообщения:
    46
    Симпатии:
    5
    У меня есть таблица users, а это другая в которую записываются все открытые участки карты этим пользователем, в этой таблице только одно поле-id
    --- Добавлено ---
    Карта 600х300, а это 180 тысяч клеток, а это много и по отдельным таблицам и в одной, хотя в таблицу записываются только окрытые клетки, открыть всю карту будет не так уж и сложно
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    в одной держи
     
    Ondottr нравится это.
  8. Ondottr

    Ondottr Новичок

    С нами с:
    24 ноя 2017
    Сообщения:
    46
    Симпатии:
    5
    Ок, спасибо
     
  9. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    Лучше 180 миллионов иметь таблиц ?:eek: Воистину поиметь бд
     
    Ondottr нравится это.
  10. Ondottr

    Ondottr Новичок

    С нами с:
    24 ноя 2017
    Сообщения:
    46
    Симпатии:
    5
    Не так написал тысяча таблиц, по 180000 записей.. но это уже не важно

    Придумал как сделать отображение засвеченых клеток без этих таблиц)
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    расскажи
     
  12. Ondottr

    Ondottr Новичок

    С нами с:
    24 ноя 2017
    Сообщения:
    46
    Симпатии:
    5
    PHP:
    1. if(!isset($_SESSION['map_num'])) {
    2.     $_SESSION['map_num'] = 1;
    3.     $result = $mysqli->query("SELECT `id` FROM `map` WHERE `x` = '{$this->startX}' AND `y` = '{$num}'"); // Достаем из БД левую верхнюю клетку карты
    4.     $map = $result->fetch_array(MYSQLI_ASSOC);
    5.     $one = $map['id'] - 1202; // Id левого верхнего угла
    6.     $two = $one + (600 * ($this->cells + 3)) + ($this->cells + 2); // Правого нижнего
    7.     $result2 = $mysqli->query("SELECT `id`, `city` FROM `map` WHERE `x` BETWEEN '{$this->startX}' - '2' AND '{$this->endX}' + '2' AND `id` BETWEEN '{$one}' AND '{$two}' AND `type` = '5'"); // Достаем из БД центры городов готорые будут полностью или частично видны на карте
    8.     while ($map = $result2->fetch_array(MYSQLI_ASSOC)) {
    9.         if (in_array($map['city'], $resorcesCityes->id)) {
    10.             for ($i = $map['id'] - 1202; $i <= $map['id'] + 1198; $i += 600) {
    11.                 for($f = $i; $f <= $i + 4; $f++) {
    12.                     $loc_id[] = $f;
    13.                 }
    14.             }
    15.         }
    16.     }
    17.  
    18. }
    Вот и результат: https://drive.google.com/open?id=1bweKM1ZoyYP1FUzzNmdoy8X0eDgKNKQS

    Всем спасибо:)
    --- Добавлено ---
    кстати раньше для показа карты 15х15 делалось 450 запросов к БДo_Oo_O ну а сейчас получается 17, но можно попробовать сделать только 3 или 17 тоже пойдет?
     
  13. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.825
    Симпатии:
    738
    Адрес:
    Татарстан
    Вообще и одного запроса должно хватить