MySQLI результат запроса (многострочный) в JSON в PHP - PullRequest
0 голосов
/ 03 июля 2018

Мне не удается увидеть все строки моего запроса MySQL, возвращенного как объект JSON, используя функцию php JSON_encode (). Вот мой код:

$Sql_Query = "SELECT * FROM Users";
$result = mysqli_query($dbc,$Sql_Query);
$ligne = array();
$bilan = array();

while ($rowr = mysqli_fetch_assoc($result)) {
    $ligne = array (
        "User_ID" => $rowr['User_ID']
    );
    $bilan[$ligne['User']] = $ligne[[
        ['User_ID'][$rowr['User_ID']]
    ]];
    array_push($bilan, $ligne);
}
echo json_encode($bilan, JSON_FORCE_OBJECT);

Возвращает меня:

{ "": NULL, "0": { "User_ID": "1"}, "1": { "User_ID": "19"}, "2": { "User_ID": "78"} , "3": { "User_ID": "79"}, "4": { "User_ID": "85"}, "5": { "User_ID": "86"}, "6": { "User_ID ":" 87 "}," 7 ": {" User_ID ":" 88 "}," 8 ": {" User_ID ":" 91 "}," 9 ": {" User_ID ":" 92 "}," 10 ": {" User_ID ":" 93 "}," 11 ": {" User_ID ":" 94 "}," 12 ": {" User_ID ":" 95 "}," 13 ": {" User_ID ": "96"}, "14": { "User_ID": "97"}, "15": { "User_ID": "98"}, "16": { "User_ID": "99"}, "17" : { "User_ID": "100"}, "18": { "User_ID": "101"}, "19": { "User_ID": "102"}, "20": { "User_ID": "103 "}," 21 ": {" User_ID ":" 104 "}," 22 ": {" User_ID ":" 105 "}," 23 ": {" User_ID ":" 106 "}," 24" : { "User_ID": "107"}, "25": { "User_ID": "108"}, "26": { "User_ID": "109"}, "27": { "User_ID": "110"} , "28": { "User_ID": "111"}, "29": { "User_ID": "112"}, "30": { "User_ID": "113"}, "31": { "User_ID ":" 114 "}," 32 ": {" User_ID ":" 115 "}," 33 ": {" User_ID ":" 116" }}

Теперь я пытаюсь связать другие поля каждой записи в выводе json. Но при добавлении этого кода мне больше не выводится.

while ($rowr = mysqli_fetch_assoc($result)) {
    $ligne = array (
        "User_ID" => $rowr['User_ID'],
        "User_Nom" => $rowr['User_Nom']
    );      
    $bilan[$ligne['User']] = $ligne[[
        ['User_ID'][$rowr['User_ID']]
    ][
        ['User_Nom'][$rowr['User_Nom']]
    ]];
    array_push($bilan, $ligne);
}
echo json_encode($bilan, JSON_FORCE_OBJECT);

Вроде бы на числовых значениях могут отображаться и не буквенные символы.

Пожалуйста, помогите мне смешать в одном выводе как числовое, так и альфа-содержимое.

Спасибо Arnaud

Ответы [ 3 ]

0 голосов
/ 04 июля 2018

Преобразовано в PHP> = 5.5 для ясности.

Я угадываю и делаю предположения, но что еще я могу сделать? Основная проблема, которую я вижу, заключается в том, что вы можете запутаться с помощью синтаксиса массива. Похоже, что вы хотите переиндексировать результаты по 'User_ID', который, как я полагаю, является некоторым строковым идентификатором, найденным в каждой записи таблицы.

Модульный, в процедурной форме ...

/*
    Assuming you are attempting to re-index by the 'User_ID' field
    of each record before encoding as JSON.
*/

function getDb($ip, $user, $password, $database) {
    $db = mysqli_connect($ip, $user, $password, $database);

    //error checking etc ...

    return $db;
}

function selectRecords(mysqli $db, $sql) {
    $result = mysqli_query($db, $sql);

    if (!$result) {
        throw new UnexpectedValueException("Database query (read) was unsuccessful!");
    }

    return $result;
}

function getUserRecords(mysqli $db) {
    $query = 'SELECT * FROM Users';
    return selectRecords($db, $query);
}

function reindexByField($newIndex, $userResults) {
    $reindexed = [];

    while ($row = mysqli_fetch_assoc($userResults)) {
        if (!isset($row[$newInded])) {
            throw new OutofBoundsException("The index '" . $newIndex . "' does not exist in the tested record");
        }

        $redindexed[$row[$newIndex]] = $row;
    }

    return $reindexed;
}

function getJsonFromArray(array $records) {
    $json = json_encode($records, JSON_FORCE_OBJECT);

    if (!$json) {
        throw new UnexpectedValueException("Records were not encoded into a JSON formatted string. Got boolean false, instead.");
    }

    return $json;
}

В процессуальной форме, тогда ...

try {
    $db = getDb($ip, $user, $password, $db); // Just pretend for a moment.
    echo getJsonFromArray(reindexByField('User_ID', getUserRecords($db));
} catch (e) {
    // Your handler code here.
} finally {
    mysqli_close($db);
}

Объектно-ориентированный подход может сделать ваш код более организованным.

0 голосов
/ 04 июля 2018

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

Я нашел в php doc возможность узнать больше об ошибке, сгенерированной при добавлении других полей в преобразовании json. json_last_error () был ключом к пониманию проблемы. И я добавил:

switch (json_last_error()) {
        case JSON_ERROR_NONE:
            echo ' - Aucune erreur';
        break;
        case JSON_ERROR_DEPTH:
            echo ' - Profondeur maximale atteinte';
        break;
        case JSON_ERROR_STATE_MISMATCH:
            echo ' - Inadéquation des modes ou underflow';
        break;
        case JSON_ERROR_CTRL_CHAR:
            echo ' - Erreur lors du contrôle des caractères';
        break;
        case JSON_ERROR_SYNTAX:
            echo ' - Erreur de syntaxe ; JSON malformé';
        break;
        case JSON_ERROR_UTF8:
            echo ' - Caractères UTF-8 malformés, probablement une erreur d\'encodage';
        break;
        default:
            echo ' - Erreur inconnue';
        break;
    }

Это возвращает мне проблему с кодировкой UTF-8. Поэтому я изменил свой код, добавив немного

utf8_encode($rowr['Fieldname'])

Первое рабочее решение очень близко от @PaulH, просто, в моем конкретном случае, я определенно должен добавить (utf8_encode ()) выражение:

    $Sql_Query = "SELECT * FROM Users";
    $result = mysqli_query($dbc,$Sql_Query);
    $ligne =array();
    $bilan = array();
    while ($rowr = mysqli_fetch_assoc($result)) {
        $ligne = array ("User_ID" => $rowr['User_ID'],  
                        "User_Nom" => utf8_encode($rowr['User_Nom']),
                        "User_Prenom" =>utf8_encode($rowr['User_Prenom']));
        array_push ($bilan, $ligne);
    }
    echo json_encode($bilan, JSON_FORCE_OBJECT); 

и теперь отображаются все поля, все строки. Но были все еще некоторые "é", преобразованные в "\ u00e9". Так что этот пост поместите окончательный кирпич в решение.

Я изменил:

JSON_FORCED_OBJECT

до

JSON_UNESCAPED_UNICODE

как параметр json_encode ().

Наконец, код, доставляющий именно то, что мне нужно, следующий:

$Sql_Query = "SELECT * FROM Users";
$result = mysqli_query($dbc,$Sql_Query);
$bilan = array();
while ($rowr = mysqli_fetch_assoc($result)) {
    $ligne = array ("User_ID" => $rowr['User_ID'],  
                    "User_Nom" => utf8_encode($rowr['User_Nom']),
                    "User_Prenom" =>utf8_encode($rowr['User_Prenom']));
    array_push ($bilan, $ligne);
}
echo json_encode($bilan, JSON_UNESCAPED_UNICODE);
0 голосов
/ 03 июля 2018

$ ligne ['User'] не инициализирован, можете попробовать это:

while ($rowr = mysqli_fetch_assoc($result)) {
    $ligne = array (
        "User_ID" => $rowr['User_ID'],
        "User_Nom" => $rowr['User_Nom']
    );      
    array_push($bilan, $ligne);
}
echo json_encode($bilan, JSON_FORCE_OBJECT);

Я проверял это с этим кодом

$result[] = ['User_ID' => 1, 'User_Nom' => 'Nom1'];
$result[] = ['User_ID' => 2, 'User_Nom' => 'Nom2'];
$result[] = ['User_ID' => 3, 'User_Nom' => 'Nom3'];
$bilan = [];
while ($rowr = array_pop($result)) {
    $ligne = array (
        "User_ID" => $rowr['User_ID'],
        "User_Nom" => $rowr['User_Nom']
    );
    array_push($bilan, $ligne);
}
echo json_encode($bilan, JSON_FORCE_OBJECT);

Это обеспечивает такой результат:

{ "0": { "User_ID": 3, "User_Nom": "Nom3"}, "1": { "User_ID": 2, "User_Nom": "Nom2"}, "2": {» User_ID ": 1," User_Nom ":" Nom1" }}

Обратите внимание, что результат имеет другое начало, он не содержит

"": нулевой,

больше. Это было результатом странной $bilan[undefined] = undefined строки

...