Я с радостью разбираю файлы 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
$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);
?>
[
{
"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"
}
]
Когда решением являются «переменные переменные», то в 999 случаях из 1000 (если не выше) вам следует остановиться и переосмыслить свой процесс. Переменные переменные в основном представляют собой неправильно сохраненные ассоциативные массивы. Я настоятельно призываю вас заранее не использовать переменные переменные в ваших проектах.
@nick ... это когда мне нужно положить ноутбук и пойти погулять по пляжу ... ваше право, конечно ...






Я порекомендую несколько значений для проверки и резервных значений по умолчанию, чтобы в вашем 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.
никаких драм. Уберем комментарии.
$o+0.5,$u+0.5и$o+1.5не являются допустимыми именами переменных PHP. Вам нужно называть их как-нибудь иначе, например.$o_plus_0_5. См. руководство по эксплуатации