Php парсинг json с символами - +

Я с радостью разбираю файлы JSON в базе данных MYSQL, но теперь у меня есть один с символами - и +, из того, что я прочитал, их нельзя использовать в переменных $ в PHP. поэтому, когда я запускаю PHP-скрипт, получаю эту ошибку.

Parse error: syntax error, unexpected '=' in C:\xampp\htdocs\TestSite\frl2_odds_test.php on line 26

Как только я удаляю 3 переменные из сценария PHP с помощью -, + из сценария, он работает и анализирует JSON в БД.

Я прочитал этот http://php.net/manual/en/language.variables.variable.php и этот https://www.experts-exchange.com/questions/28628085/json-encode-fails-with-special-characters.html, но не смог найти решения. любая помощь оценена ... спасибо .. код следующим образом ...

PHP

    <?php
$host = "localhost";
$username = "";
$password = "";
$dbname = "football";
$con = mysqli_connect($host, $username, $password, $dbname) or die('Error in Connecting: ' . mysqli_error($con));

$st = mysqli_prepare($con, 'INSERT INTO frl2_odd(match_id, odd_bookmakers, odd_date, odd_1, odd_x, odd_2, odd_1x, o+0.5, u+0.5, o+1.5, bts_yes, bts_no) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');

mysqli_stmt_bind_param($st, 'ssssssssssss', $match_id, $odd_bookmakers, $odd_date, $odd_1, $odd_x, $odd_2, $odd_1x, $o+0.5, $u+0.5, $o+1.5, $bts_yes, $bts_no);

$filename = 'json/testodds.json';
$json = file_get_contents($filename);
$data = json_decode($json, true);

foreach($data as $row) {
$match_id = $row['match_id'];
$odd_bookmakers = $row['odd_bookmakers'];
$odd_date = $row['odd_date'];
$odd_1 = $row['odd_1'];
$odd_x = $row['odd_x'];
$odd_2 = $row['odd_2'];
$odd_1x = $row['odd_1x'];
$o+0.5 = $row['o+0.5'];
$u+0.5 = $row['u+0.5'];
$o+1.5 = $row['o+1.5'];
$bts_yes = $row['bts_yes'];
$bts_no = $row['bts_no'];

mysqli_stmt_execute($st);
}
mysqli_close($con);
?>

JSON

[
{
"match_id": "345064",
"odd_bookmakers": "Interwetten.es",
"odd_date": "2018-10-24 04:39:45",
"odd_1": "2.05",
"odd_x": "2.95",
"odd_2": "3.95",
"odd_1x": "",
"odd_12": "",
"odd_x2": "",
"ah-4.5_1": "",
"ah-4.5_2": "",
"ah-4_1": "",
"ah-4_2": "",
"ah-3.5_1": "",
"ah-3.5_2": "",
"ah-3_1": "",
"ah-3_2": "",
"ah-2.5_1": "",
"ah-2.5_2": "",
"ah-2_1": "",
"ah-2_2": "",
"ah-1.5_1": "",
"ah-1.5_2": "",
"ah-1_1": "3.00",
"ah-1_2": "1.33",
"ah0_1": "1.42",
"ah0_2": "2.65",
"ah+0.5_1": "",
"ah+1_1": "",
"ah+1_2": "",
"ah+1.5_1": "",
"ah+1.5_2": "",
"ah+2_1": "",
"ah+2_2": "",
"ah+2.5_1": "",
"ah+2.5_2": "",
"ah+3_1": "",
"ah+3_2": "",
"ah+3.5_1": "",
"ah+3.5_2": "",
"ah+4_1": "",
"ah+4_2": "",
"ah+4.5_1": "",
"ah+4.5_2": "",
"o+0.5": "",
"u+0.5": "",
"o+1": "",
"u+1": "",
"o+1.5": "",
"u+1.5": "",
"o+2": "",
"u+2": "",
"o+2.5": "2.45",
"u+2.5": "1.48",
"o+3": "",
"u+3": "",
"o+3.5": "",
"u+3.5": "",
"o+4": "",
"u+4": "",
"o+4.5": "",
"u+4.5": "",
"o+5": "",
"u+5": "",
"o+5.5": "",
"u+5.5": "",
"bts_yes": "2.05",
"bts_no": "1.67"
}
]
$o+0.5, $u+0.5 и $o+1.5 не являются допустимыми именами переменных PHP. Вам нужно называть их как-нибудь иначе, например. $o_plus_0_5. См. руководство по эксплуатации
Nick 28.10.2018 01:26

Когда решением являются «переменные переменные», то в 999 случаях из 1000 (если не выше) вам следует остановиться и переосмыслить свой процесс. Переменные переменные в основном представляют собой неправильно сохраненные ассоциативные массивы. Я настоятельно призываю вас заранее не использовать переменные переменные в ваших проектах.

mickmackusa 28.10.2018 02:42

@nick ... это когда мне нужно положить ноутбук и пойти погулять по пляжу ... ваше право, конечно ...

Paul mac 28.10.2018 09:14
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
3
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Моя линия подготовки удаляет ненужные элементы, упорядочивает желаемые элементы и переиндексирует массив.

Непроверенный код: (Демонстрация подготовки)

$cols = array_fill_keys(['match_id', 'odd_bookmakers', 'odd_date', 'odd_1', 'odd_x', 'odd_2', 'odd_1x', 'o+0.5', 'u+0.5', 'o+1.5', 'bts_yes', 'bts_no'], null);
$types = str_repeat('s', sizeof($cols));

foreach(json_decode($json, true) as $row) {
    $row = array_values(array_replace($cols, array_intersect_key($row, $cols)));
    mysqli_stmt_bind_param($st, $types, ...$row);  // splat operator needs indexed elements to unpack
    mysqli_stmt_execute($st);
}

* Я не тестировал реализацию вызовов mysqli, обычно не использую процедурный синтаксис.

* Я думаю, вам также нужно заключить в кавычки имена столбцов с обратной кавычкой.


Хорошо, я проверил это на своем локальном хосте, чтобы добиться успеха:

if (!$db = new mysqli("localhost", "root", "", "db")) {  // declare and check for a falsey value
    echo "Connection Failure"; // $db->connect_error <-- never show actual error details to public
} else {
    $json = file_get_contents('json/testodds.json');
    $columns = ['match_id', 'odd_bookmakers', 'odd_date', 'odd_1', 'odd_x', 'odd_2', 'odd_1x', 'o+0.5', 'u_+0.5', 'o+1.5', 'bts_yes', 'bts_no'];
    $cols_count = sizeof($columns);
    $cols_defaults = array_fill_keys($columns, null);
    $quoted_cs_cols = implode(',', array_map(function($v){return "`$v`";}, $columns));
    $cs_placeholders = implode(',', array_fill(0, $cols_count, "?"));
    $cols_types = str_repeat('s', $cols_count);
    $sql = "INSERT INTO frl2_odd ($quoted_cs_cols) VALUES ($cs_placeholders)";
    // echo $sql , "<br>";
    if (!$stmt = $db->prepare($sql)) {
        echo "Error @ prepare"; // $db->error; <-- never show actual error details to public
    } else {
        foreach(json_decode($json, true) as $i => $row) {
            $row = array_values(array_replace($cols_defaults, array_intersect_key($row, $cols_defaults)));
            if (!$stmt->bind_param($cols_types, ...$row) || !$stmt->execute()) {
                echo "Error @ execute";  //$stmt->error;  <-- never show actual error details to public
            } else {
                echo "Row Index $i successfully added.<br>"; 
            }
        }
    }
}

Прелесть $columns в том, что когда вы хотите настроить нужные столбцы, вам нужно всего лишь изменить одну строку кода и синхронизировать таблицу db.

никаких драм. Уберем комментарии.

mickmackusa 28.10.2018 11:46

Другие вопросы по теме