Автоматическое создание таблицы и столбцов MySQL из данных JSON - PullRequest
0 голосов
/ 15 октября 2019

Я пытаюсь прочитать JSON, полученный из API. Я хочу взять эти данные и автоматически создать таблицу и столбцы, необходимые для хранения полученной информации. Я не хочу создавать столбцы статически, потому что каждая монета, которую я запускаю, может содержать больше или меньше информации.

Мой код ниже в настоящее время будет создавать только 3 столбца (идентификатор, имя и тикеры) и вставлять данные в идентификатор и имя.
Он не пройдет через первый массив информации.
Во-вторыхЯ получаю сообщение об ошибке '$qi .= "'" . mysqli_real_escape_string($conn, $value) . "',";' Warning: mysqli_real_escape_string() expects parameter 2 to be string, array given, которое не знаю, как исправить.

Исходный код

$apiurl = "https://api.coingecko.com/api/v3/coins/infocoin/tickers";
$json = file_get_contents($apiurl);

    JSON_to_table($json);

            function JSON_to_table($json, $tblName = "New_JSON_table_"){
    $conn = mysqli_connect($GLOBALS["db"]["host"], $GLOBALS["db"]["user"], $GLOBALS["db"]["pass"], $GLOBALS["db"]["name"]);
            $j_obj = json_decode($json, true);
        //$j_obj2 = $j_obj["tickers"];
        //var_dump($j_obj);
    print_r ($j_obj);
            if(!mysqli_num_rows( mysqli_query($conn,"SHOW TABLES LIKE '" . $tblName . "'"))){ 
                $cq = "CREATE TABLE ". $tblName ." (
                id1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,";
                foreach($j_obj as $j_arr_key => $value){
                    $cq .= $j_arr_key . " VARCHAR(256),";

        }
                $cq = substr_replace($cq,"",-1);
                $cq .= ")";
                mysqli_query($conn,$cq) or die(mysqli_error($conn));
            }

            $qi = "REPLACE INTO $tblName (";
            reset($j_obj);
                foreach($j_obj as $j_arr_key => $value){
                    $qi .= $j_arr_key . ",";
                }
                $qi = substr_replace($qi,"",-1);
            $qi .= ") VALUES (";
            next($j_obj);
                foreach($j_obj as $j_arr_key => $value){
                    $qi .= "'" . mysqli_real_escape_string($conn, $value) . "',";
            $qi .= "'" .$value . "',";
                }
            $qi = substr_replace($qi,"",-1);
            $qi .= ")";
            $result = mysqli_query($conn,$qi) or die(mysqli_error($conn));

        return true;

Код, который выдает повторяющееся имя столбца: ошибка

$apiurl = "https://api.coingecko.com/api/v3/coins/infocoin/tickers";
$json = file_get_contents($apiurl);

    JSON_to_table($json);

            function JSON_to_table($json, $tblName = "New_JSON_table_"){
    $conn = mysqli_connect($GLOBALS["db"]["host"], $GLOBALS["db"]["user"], $GLOBALS["db"]["pass"], $GLOBALS["db"]["name"]);
            $j_obj = json_decode($json, true);
        //$j_obj2 = $j_obj["tickers"];
        //var_dump($j_obj);
    print_r ($j_obj);
            if(!mysqli_num_rows( mysqli_query($conn,"SHOW TABLES LIKE '" . $tblName . "'"))){ 
                $cq = "CREATE TABLE ". $tblName ." (
                id1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,";
                foreach($j_obj as $j_arr_key => $value){
                    $cq .= $j_arr_key . " VARCHAR(256),";

        }
        next($j_obj);
                foreach($j_obj as $j_arr_key => $value){
                    $cq .= $j_arr_key . " VARCHAR(256),";

        }
                $cq = substr_replace($cq,"",-1);
                $cq .= ")";
                mysqli_query($conn,$cq) or die(mysqli_error($conn));
            }

            $qi = "REPLACE INTO $tblName (";
            reset($j_obj);
                foreach($j_obj as $j_arr_key => $value){
                    $qi .= $j_arr_key . ",";
                }
                $qi = substr_replace($qi,"",-1);
            $qi .= ") VALUES (";
            next($j_obj);
                foreach($j_obj as $j_arr_key => $value){
                    $qi .= "'" . mysqli_real_escape_string($conn, $value) . "',";
            $qi .= "'" .$value . "',";
                }
            $qi = substr_replace($qi,"",-1);
            $qi .= ")";
            $result = mysqli_query($conn,$qi) or die(mysqli_error($conn));

        return true;

Я изменил код несколькими способами. Я наконец-то сделал так, чтобы он вставлял все данные из второго массива в столбец «тикеры», но я этого не хочу. Я получил код почти для добавления оставшихся имен столбцов, но затем он дает мне ошибку Duplicate column name 'name'

Отредактированный код из комментариев ниже

    $apiurl = "https://api.coingecko.com/api/v3/coins/infocoin/tickers";
    $json = file_get_contents($apiurl);

        JSON_to_table($json);

                function JSON_to_table($json, $tblName = "New_JSON_table_"){
        $conn = mysqli_connect($GLOBALS["db"]["host"], $GLOBALS["db"]["user"], $GLOBALS["db"]["pass"], $GLOBALS["db"]["name"]);
                $j_obj = json_decode($json, true);
            //$j_obj2 = $j_obj["tickers"];
            //var_dump($j_obj);
        print_r ($j_obj);
                if(!mysqli_num_rows( mysqli_query($conn,"SHOW TABLES LIKE '" . $tblName . "'"))){ 
                    $cq = "CREATE TABLE ". $tblName ." (
                    id1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,";
                    foreach($j_obj["tickers"][0] as $j_arr_key => $value){
                        $cq .= $j_arr_key . " VARCHAR(256),";

            }
                    $cq = substr_replace($cq,"",-1);
                    $cq .= ")";
                    mysqli_query($conn,$cq) or die(mysqli_error($conn));
                }

                $qi = "REPLACE INTO $tblName (";
                reset($j_obj["tickers"][0]);
                    foreach($j_obj["tickers"][0] as $j_arr_key => $value){
                        $qi .= $j_arr_key . ",";
                    }
                    $qi = substr_replace($qi,"",-1);
                $qi .= ") VALUES (";
                next($j_obj);
                    foreach($j_obj["tickers"][0] as $j_arr_key => $value){
                        $qi .= "'" . mysqli_real_escape_string($conn, $value) . "',";
                $qi .= "'" .$value . "',";
                    }
                $qi = substr_replace($qi,"",-1);
                $qi .= ")";
                $result = mysqli_query($conn,$qi) or die(mysqli_error($conn));

            return true;

Ошибки из обновленного кода

        Warning: mysqli_real_escape_string() expects parameter 2 to be string, array given in /var/www/html/exp/coingecko_testmarket.php on line 86

        Notice: Array to string conversion in /var/www/html/exp/coingecko_testmarket.php on line 87

         Warning: mysqli_real_escape_string() expects parameter 2 to be string, array given in /var/www/html/exp/coingecko_testmarket.php on line 86

        Notice: Array to string conversion in /var/www/html/exp/coingecko_testmarket.php on line 87

        Warning: mysqli_real_escape_string() expects parameter 2 to be string, array given in /var/www/html/exp/coingecko_testmarket.php on line 86

        Notice: Array to string conversion in /var/www/html/exp/coingecko_testmarket.php on line 87
       Column count doesn't match value count at row 1

1 Ответ

0 голосов
/ 15 октября 2019

Проблема в том, что данные в этом json хранятся в виде многоуровневой структуры (объекты, содержащие другие объекты), которую вы не можете сохранить в базе данных SQL как есть.

Вы должны сгенерировать 'createtable 'запрос для первого элемента из' tickers array $j_obj['tickers'][0], а затем создайте запрос 'insert' для каждого элемента этого массива, но у вас все еще есть значения, которые не являются простыми строками, поэтому вам нужно преобразовать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...