0

У меня есть код, когда начинается цикл, работает сначала вроде-бы правильно, но почемуто заходит на второй круг, и бывает что идет на шаги больше чем указан count()

<?php
        include "../config.php";
        include 'simplexlsx-master/src/SimpleXLSX.php';
    set_time_limit(500);

    $user_events_log = array();
    function event($a, $b, $c, $d, $dbsql) {
        $event = 'UPDATE app_temp_log SET `table_name` = &quot;' . $a . '&quot;, `count` = &quot;' . $b . '&quot;, `progress` = &quot;' . $c . '&quot;, `event` = &quot;' . $d . '&quot; WHERE id = 100';
        $dbsql-&gt;query($event);
    }

    function import_log($a, $b, $c, $d, $e, $dbsql) {
        $log = 'INSERT INTO ' . 'app_file_import_log' . ' (`admin_name`, `admin_type`, `file_name`, `file_size`, `events`) VALUES (&quot; '. $a .'&quot;, &quot; '. $b .'&quot;, &quot; '. $c .'&quot;, &quot; '. $d .'&quot;, &quot; '. $e .'&quot;)';
        $dbsql-&gt;query($log);

        if (!empty($dbsql-&gt;error)) {
            var_dump($dbsql-&gt;error);
        }

    }

    // Принимаем файл
    $uploaddir = '../../uploads/';
    $uploadfile = $uploaddir . basename($_FILES['file']['name']);

    // Достаем именя всех таблиц в базе
    $tables_array = array();
    $check_tables_in_data_base = $db-&gt;query(&quot;SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA=&quot; . &quot;'&quot; . DB_NAME . &quot;'&quot;);
    while ($collumn = $check_tables_in_data_base-&gt;fetch_assoc()) {
        array_push($tables_array, $collumn['TABLE_NAME']);
    }

    // Идем в файл
    if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile)) {
        array_push($user_events_log, '&lt;li&gt;' . 'Файл загружен' . '&lt;/li&gt;');
        event(&quot;&quot;, &quot;&quot;, &quot;&quot;, 'Файл загружен', $db);

        if ($xlsx = SimpleXLSX::parse($uploadfile)) {
            // Определяем сколько вкладок в документе
            $count_tabs = count($xlsx-&gt;sheetNames());
            // $count_tabs = 5;
            // Запускаем цикл по вкладкам
            $import_progress = 0;
//          var_dump($count_tabs);
//          var_dump($xlsx-&gt;sheetName( 21 ));
//          var_dump($xlsx-&gt;rows(21)[0][16]);
//          die();

            for ($tab = 0; $tab &lt; $count_tabs; $tab++) {
                if ($tab &lt;= $count_tabs) {
                    $import_progress++;
                } else {
                    $import_progress = $import_progress;
                }
                // echo $xlsx-&gt;sheetName( $tab );
                $table_name = 'app_catalog_' . $xlsx-&gt;rows($tab)[0][16];
                // echo '&lt;pre&gt;'; print_r( $xlsx-&gt;rows($tab));
                // var_dump(count($xlsx-&gt;rows($tab)));

                // Проверяем есть ли такая таблица в базе
                if (array_intersect(explode(' ', $table_name), $tables_array)) {
                    $sql_table_clear = 'TRUNCATE TABLE ' . $table_name;
                    $db-&gt;query($sql_table_clear);
                    array_push($user_events_log, '&lt;li&gt;' . 'Чистка таблицы ' . $xlsx-&gt;sheetName( $tab ) . '&lt;/li&gt;');
                    event($table_name, $count_tabs, $import_progress, 'Чистка таблицы ' . $xlsx-&gt;sheetName( $tab ), $db);
                } else {
                    if ($table_name != 'app_catalog_') {
                        $sql_create_new_table = &quot;CREATE TABLE $table_name (
                      `number` int(11) NOT NULL,
                      `name` text NOT NULL,
                      `brand` text NOT NULL,
                      `a` text NOT NULL,
                      `b` text NOT NULL,
                      `c` text NOT NULL,
                      `d` text NOT NULL,
                      `e` text NOT NULL,
                      `f` text NOT NULL,
                      `g` text NOT NULL,
                      `h` text NOT NULL,
                      `amount` text NOT NULL,
                      `application` text NOT NULL,
                      `note` text NOT NULL,
                      `jrone` text NOT NULL,
                      `ee` text NOT NULL
                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;&quot;;
                        $db-&gt;query($sql_create_new_table);
                        array_push($user_events_log, '&lt;li&gt;' . 'Создание таблицы ' . $xlsx-&gt;sheetName( $tab ) . '&lt;/li&gt;');
                        event($table_name, $count_tabs, $import_progress, 'Создание таблицы ' . $xlsx-&gt;sheetName( $tab ), $db);
                    }
                }

                // Формируем запрос в Базу данных
                $val_array = &quot;&quot;;
                for ($request = 0; $request &lt; count($xlsx-&gt;rows($tab)); $request++) {
                    if ($request == 0) {
                        continue;
                    }
                    $row = $xlsx-&gt;rows($tab)[$request];
                    $val_array = $val_array . '(' . &quot;'$row[0]','$row[1]','$row[2]','$row[3]','$row[4]','$row[5]','$row[6]','$row[7]','$row[8]','$row[9]','$row[10]','$row[11]','$row[12]','$row[13]','$row[14]','$row[15]'&quot; . '),';
                }
                $sql_table_clear = 'TRUNCATE TABLE app_catalog_' . $table_name;
                $sql_request = 'INSERT INTO ' . $table_name . ' (`number`, `name`, `brand`, `a`,`b`,`c`,`d`,`e`,`f`,`g`,`h`, `amount`,`application`, `note` ,`jrone`, `ee`) VALUES ' . $val_array;
                $sql_request = trim($sql_request, ',');
                $sql_request = $sql_request . ';';
                $import_result = $db-&gt;query($sql_table_clear) . $db-&gt;query($sql_request);
                if ($import_result != true) {
                    $error = $db-&gt;error;
                    if ($table_name != 'app_catalog_') {
                        array_push($user_events_log, '&lt;li&gt;' . '&lt;b&gt;Ошибка обновления таблицы&lt;/b&gt;' . '&lt;strong&gt;' . $error . '&lt;/strong&gt;' . $xlsx-&gt;sheetName($tab) . ', проверьте SQL запрос ' . '&lt;code&gt;'.$sql_request.'&lt;/code&gt;&lt;textarea&gt;'.$sql_request.'&lt;/textarea&gt;&lt;/li&gt;');
                        event($table_name, $count_tabs, $import_progress, 'Ошибка обновления таблицы ' . $xlsx-&gt;sheetName($tab), $db);
                    } else {
                        array_push($user_events_log, '&lt;li&gt;' . '&lt;b&gt;Ошибка обновления таблицы&lt;/b&gt;' . '&lt;strong&gt;' . $error . '&lt;/strong&gt;' . $xlsx-&gt;sheetName($tab) . ', проверьте SQL запрос ' . '&lt;code&gt;'.$sql_request.'&lt;/code&gt;&lt;textarea&gt;'.$sql_request.'&lt;/textarea&gt;&lt;/li&gt;');
                        event($table_name, $count_tabs, $import_progress, 'Ошибка обновления таблицы ' . $xlsx-&gt;sheetName($tab) . '. Отсутствует имя таблици в столбце Q или имя указано неверно!', $db);
                    }
                } else {
                    array_push($user_events_log, '&lt;li&gt;' . 'Таблица ' . $xlsx-&gt;sheetName($tab) . ' обновлена' . '&lt;/li&gt;');
                    event($table_name, $count_tabs, $import_progress, 'Таблица ' . $xlsx-&gt;sheetName($tab) . ' обновлена', $db);
                }

            }
        } else {
            event(&quot;&quot;, &quot;&quot;, &quot;100&quot;, SimpleXLSX::parseError(), $db);
        }
        import_log($_POST['admin_name'], $_POST['admin_type'], $_FILES['file']['name'], $_FILES['file']['size'], str_replace('&lt;/li&gt;,', '&lt;/li&gt;', implode(',', $user_events_log)), $db);
        event(&quot;&quot;, &quot;&quot;, &quot;100&quot;, 'Импорт окончен', $db);
        echo &quot;true&quot;;
    } else {
        echo &quot;false&quot;;
    }

  • 2
  • Нарисуй блок-схему своего кода и найдешь все уязвимости. – Алексей Nov 08 '21 at 10:07
  • Насколько я вижу у Вас два цикла for ($tab = 0; $tab < $count_tabs; $tab++) и for ($request = 0; $request < count($xlsx->rows($tab)); $request++). Простой var_dump( count($xlsx->sheetNames()) ); и var_dump( count($xlsx->rows($tab)) ); подскажет Вам сколько раз крутится каждый цикл. А вообще, уберите код из одного цикла - выведите что-то и проверьте верно ли это. Если все ок - верните код обратно. Поступите также со вторым циклом. Это же простые методы отладки. Также проверьте не переопределяете ли Вы в где переменные по которым бежит цикл $tab и $request –  Nov 08 '21 at 10:14

0 Answers0