JSON кодирует результаты MySQL

Как использовать функцию json_encode() с результатами запроса MySQL? Нужно ли мне перебирать строки или я могу просто применить это ко всему объекту результатов?

Соответствующий вопрос + ответ о проблеме строкового типа: stackoverflow.com/questions/28261613/…

Marcel Ennix 01.02.2015 14:28

Я знаю, что это очень старый вопрос. Но никто не предлагает простейшей альтернативы решению проблемы отображения целых чисел в виде строк. @mouckatron предлагает флаг JSON_NUMERIC_CHECK для json_encode() в ответе ниже. Просто и работает как шарм! stackoverflow.com/questions/1390983/…

AlexGM 18.02.2014 02:00
Стоит ли изучать 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 и хотите разрабатывать...
312
2
543 359
18
Перейти к ответу Данный вопрос помечен как решенный

Ответы 18

http://www.php.net/mysql_query говорит: «mysql_query() возвращает ресурс».

http://www.php.net/json_encode говорит, что может кодировать любое значение «кроме ресурса».

Вам нужно выполнить итерацию и собрать результаты базы данных в массив, а затем в массив json_encode.

mysql_query не возвращает набор результатов. для этого нужен mysql_fetch *.

Andy 21.12.2008 04:30

Эм ... да ... это то, что происходит при итерации между mysql_query и json_encode. Хороший звонок, Ватсон.

Hugh Bothwell 17.01.2009 07:27
Ответ принят как подходящий
$sth = mysqli_query($conn, "SELECT ...");
$rows = array();
while($r = mysqli_fetch_assoc($sth)) {
    $rows[] = $r;
}
print json_encode($rows);

Для функции json_encode требуется PHP> = 5.2 и пакет php-json - как уже упоминалось, здесь

ПРИМЕЧАНИЕ: mysql устарел с PHP 5.5.0, используйте расширение mysqli вместо http://php.net/manual/en/migration55.deprecated.php.

Я бы посоветовал, как и вы, упомянуть, что во время запроса на выбор использовать AS для переименования столбцов во что-то для публики, например SELECT blog_title as title, это чище, и публика не знает, какие именно столбцы из базы данных.

RobertPitt 05.02.2011 20:04

Этот код ошибочно кодирует все числовые значения как строки. Например, числовое поле mySQL с именем score будет иметь значение JSON «12» вместо 12 (обратите внимание на кавычки).

Theo 25.09.2011 22:48

@RobertPitt, безопасность, основанная на сокрытии имен ваших столбцов, - безопасность неизвестностью!

Innate Imunity is The Way 03.12.2011 01:10

Вы можете использовать мой класс: ajaxian.com/archives/php-based-mysql-to-json-converter

Volatil3 09.12.2012 15:29

@Tomas правда, но знание точных имен столбцов значительно упрощает атаки SQL-инъекций

Tim Seguine 02.04.2013 17:28

@Tim: Если вы дошли до того, что известные имена столбцов - это единственный барьер для SQL-инъекций, который вы уже потеряли, нет?

Paolo Bergantino 02.04.2013 19:03

@PaoloBergtino достаточно честно. Но я бы все же предпочел не раскрывать внутренности. У меня плохое ощущение дизайна от такого интерфейса. У меня есть подозрение, что реальная проблема OP (не указанная в сообщении) может быть лучше решена в любом случае без отправки кучи строк результатов SQL, закодированных как json.

Tim Seguine 04.04.2013 12:26

Добавляет ли "$ rows [] = $ r" каждый раз элементы в массив? Я нигде не вижу документированного использования "[]". Спасибо.

Oscar 15.08.2013 09:06

@PaoloBergantino Можем ли мы преобразовать данные json в mysql или мы можем запросить данные json?

Rocket 11.09.2013 21:58

@RobertPitt, я согласен, но больше на основании определения интерфейса API. Это позволяет изменять базовую таблицу. Не обязательно по соображениям безопасности.

Josh Petitt 26.10.2013 06:32

Как затем использовать возвращаемый объект JSON? var obj = JSON.parse (ответ); не дает мне ничего, кроме нуля

prismspecs 28.11.2013 05:29

Но у меня есть предупреждение: Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given означает, что mysql_query возвращает тип boolean, а не какую-то структуру классов?

mr5 06.05.2014 11:09

@ mr5: Если вы получаете логическое значение для запроса SELECT, это означает, что он не удался. Из документации: For SELECT, SHOW, DESCRIBE, EXPLAIN and other statements returning resultset, mysql_query() returns a resource on success, or FALSE on error.

Paolo Bergantino 06.05.2014 19:11

@ Тео, что тогда делать?

Muhammad Babar 22.07.2014 15:20

@Theo Есть соответствующий вопрос + ответ о проблеме типа строки по адресу: stackoverflow.com/questions/28261613/…

Marcel Ennix 01.02.2015 14:24

Убедитесь, что числовые целые числа не преобразуются в строку с помощью JSON Encode. Используйте $ sth = mysqli_query ("SELECT ..."); $ строк = массив (); в то время как ($ r = mysqli_fetch_assoc ($ sth)) {$ rows [] = $ r; } печать json_encode ($ строк, JSON_NUMERIC_CHECK);

Asuquo12 07.11.2017 12:48

Не могли бы вы объяснить использование $ rows [] = $ r; потому что нам не нравится добавлять строку в массив что-то вроде $ row [i] = $ r, потому что мы не будем заменять все данные в массиве, выполняя $ rows [] = $ r;

Femn Dharamshi 24.07.2018 16:35

Это неправильный код. Вы должны сначала получить результат запроса, а затем использовать результат для выборки строк.

Henrik Erlandsson 18.12.2019 12:32

По моему опыту, приведенное выше не сработает, прежде чем вы назовете корневой элемент в массиве к чему-то, я не смог получить доступ ни к чему в final json перед этим.

$sth = mysql_query("SELECT ...");
$rows = array();
while($r = mysql_fetch_assoc($sth)) {
    $rows['root_name'] = $r;
}
print json_encode($rows);

Это должно делать свое дело!

Попробуйте это, это правильно создаст ваш объект

 $result = mysql_query("SELECT ...");
 $rows = array();
   while($r = mysql_fetch_assoc($result)) {
     $rows['object_name'][] = $r;
   }

 print json_encode($rows);

+1 Кажется, это единственный ответ, который предоставляет JSON в том же формате, что и примеры на json.org/example.

ban-geoengineering 16.09.2014 18:13

Да, этот пример дает ключ для каждой строки.

Mar 30.06.2017 22:48

Мое простое исправление, чтобы он не ставил речевые метки вокруг числовых значений ...

while($r = mysql_fetch_assoc($rs)){
    while($elm=each($r))
    {
        if (is_numeric($r[$elm["key"]])){
                    $r[$elm["key"]]=intval($r[$elm["key"]]);
        }
    }
    $rows[] = $r;
}   

Еще один вариант использования цикла FOR:

 $sth = mysql_query("SELECT ...");
 for($rows = array(); $row = mysql_fetch_assoc($sth); $rows[] = $row);
 print json_encode($rows);

Единственным недостатком является то, что цикл for работает медленнее, чем, например. while или особенно foreach

Извините, это слишком долго после вопроса, но:

$sql = 'SELECT CONCAT("[", GROUP_CONCAT(CONCAT("{username:'",username,"'"), CONCAT(",email:'",email),"'}")), "]") 
AS json 
FROM users;'
$msl = mysql_query($sql)
print($msl["json"]);

Просто в основном:

"SELECT" Select the rows    
"CONCAT" Returns the string that results from concatenating (joining) all the arguments
"GROUP_CONCAT" Returns a string with concatenated non-NULL value from a group

Помните, что GROUP_CONCAT() ограничен group_concat_max_len.

eggyal 11.10.2012 10:30

Я бы не рекомендовал никому использовать эту хакерскую технику.

mickmackusa 11.10.2020 19:23
$rows = json_decode($mysql_result,true);

так просто, как, что :-)

Например $ result = mysql_query ("ВЫБРАТЬ * ИЗ пользовательских профилей, где ИМЯ = 'ТЕСТУСЕР'");

1.), если $ result - только одна строка.

$response = mysql_fetch_array($result);
echo json_encode($response);

2.) если $ result больше одной строки. Вам нужно перебрать строки и сохранить их в массив и вернуть json с массивом в нем.

$rows = array();
if (mysql_num_rows($result) > 0) {
    while($r = mysql_fetch_assoc($result)) {
       $id = $r["USERID"];   //a column name (ex.ID) used to get a value of the single row at at time
       $rows[$id] = $r; //save the fetched row and add it to the array.
    }
}    
echo json_encode($rows);

мы могли бы упростить ответ Паоло Бергантино следующим образом

$sth = mysql_query("SELECT ...");
print json_encode(mysql_fetch_assoc($sth));

Я не думаю, что ты сможешь.

mickmackusa 11.10.2020 19:26

Приведенный ниже код отлично работает здесь!

<?php

  $con=mysqli_connect("localhost",$username,$password,databaseName);

  // Check connection
  if (mysqli_connect_errno())
  {
   echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

  $query = "the query here";

  $result = mysqli_query($con,$query);

  $rows = array();
  while($r = mysqli_fetch_array($result)) {
    $rows[] = $r;
  }
  echo json_encode($rows);

  mysqli_close($con);
?>

Спасибо .. мой ответ таков:

if ($result->num_rows > 0) {
            # code...
            $arr = [];
            $inc = 0;
            while ($row = $result->fetch_assoc()) {
                # code...
                $jsonArrayObject = (array('lat' => $row["lat"], 'lon' => $row["lon"], 'addr' => $row["address"]));
                $arr[$inc] = $jsonArrayObject;
                $inc++;
            }
            $json_array = json_encode($arr);
            echo $json_array;
        }
        else{
            echo "0 results";
        }

Я решил вот так

$stmt->bind_result($cde,$v_off,$em_nm,$q_id,$v_m);
    $list=array();
    $i=0;
    while ($cresult=$stmt->fetch()){    


        $list[$i][0]=$cde;
        $list[$i][1]=$v_off;
        $list[$i][2]=$em_nm;
        $list[$i][3]=$q_id;
        $list[$i][4]=$v_m;
        $i=$i+1;
    }
    echo json_encode($list);        

Это будет возвращено в ajax как набор результатов и используя синтаксический анализ json в части javascript, например:

obj = JSON.parse(dataX);
$array = array();
$subArray=array();
$sql_results = mysql_query('SELECT * FROM `location`');

while($row = mysql_fetch_array($sql_results))
{
    $subArray[location_id]=$row['location'];  //location_id is key and $row['location'] is value which come fron database.
    $subArray[x]=$row['x'];
    $subArray[y]=$row['y'];


 $array[] =  $subArray ;
}
echo'{"ProductsData":'.json_encode($array).'}';

Каким образом этот необъяснимый пост имеет какое-то новое значение для этой страницы? Я вижу ключи без кавычек, устаревшие вызовы mysql_ и созданную вручную строку json. В этом ответе слишком много отрицательных моментов.

mickmackusa 11.10.2020 19:31
<?php
define('HOST','localhost');
define('USER','root');
define('PASS','');
define('DB','dishant');

$con = mysqli_connect(HOST,USER,PASS,DB);


  if (mysqli_connect_errno())
  {
   echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

 $sql = "select * from demo ";

 $sth = mysqli_query($con,$sql);

$rows = array();

while($r = mysqli_fetch_array($sth,MYSQL_ASSOC)) {

 $row_array['id'] = $r;

    **array_push($rows,$row_array);**
}
echo json_encode($rows);

mysqli_close($con);
?>

aarray_push ($ строк, $ row_array); помогает построить массив, иначе он даст последнее значение в цикле while

это работает как метод добавитьStringBuilder в Ява

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

// Code of Conversion
$query = "SELECT * FROM products;";
$result = mysqli_query($conn , $query);

if ($result) {
echo "</br>"."Results Found";

// Conversion of result object into JSON format
$rows = array();
while($temp = mysqli_fetch_assoc($result)) {
    $rows[] = $temp;
}
echo "</br>" . json_encode($rows);

} else {
    echo "No Results Found";
}

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

mickmackusa 11.10.2020 19:29

Код:

$rows = array();

while($r = mysqli_fetch_array($result,MYSQL_ASSOC)) {

 $row_array['result'] = $r;

  array_push($rows,$row_array); // here we push every iteration to an array otherwise you will get only last iteration value
}

echo json_encode($rows);

При использовании PDO

Используйте fetchAll(), чтобы получить все строки в виде ассоциативного массива.

$stmt = $pdo->query('SELECT * FROM article');
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($rows);

Когда ваш SQL имеет параметры:

$stmt = $pdo->prepare('SELECT * FROM article WHERE id=?');
$stmt->execute([1]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($rows);

Когда вам нужно изменить ключ таблицы, вы можете использовать цикл foreach и построить массив вручную.

$stmt = $pdo->prepare('SELECT * FROM article WHERE id=?');
$stmt->execute([1]);

$rows = [];
foreach ($stmt as $row) {
    $rows[] = [
        'newID' => $row['id'],
        'Description' => $row['text'],
    ];
}

echo json_encode($rows);

При использовании mysqli

Используйте fetch_all(), чтобы получить все строки как ассоциативный массив.

$res = $mysqli->query('SELECT * FROM article');
$rows = $res->fetch_all(MYSQLI_ASSOC);
echo json_encode($rows);

Когда ваш SQL имеет параметры, вам необходимо выполнить команду prepare / bind / execute / get_result.

$id = 1;
$stmt = $mysqli->prepare('SELECT * FROM article WHERE id=?');
$stmt->bind_param('s', $id); // binding by reference. Only use variables, not literals
$stmt->execute();
$res = $stmt->get_result(); // returns mysqli_result same as mysqli::query()
$rows = $res->fetch_all(MYSQLI_ASSOC);
echo json_encode($rows);

Когда вам нужно изменить ключ таблицы, вы можете использовать цикл foreach и построить массив вручную.

$stmt = $mysqli->prepare('SELECT * FROM article WHERE id=?');
$stmt->bind_param('s', $id);
$stmt->execute();
$res = $stmt->get_result();

$rows = [];
foreach ($res as $row) {
    $rows[] = [
        'newID' => $row['id'],
        'Description' => $row['text'],
    ];
}

echo json_encode($rows);

При использовании mysql_ * API

Пожалуйста, обновите как можно скорее до поддерживаемой версии PHP! Пожалуйста, отнеситесь к этому серьезно. Если вам нужно решение с использованием старого API, это можно сделать следующим образом:

$res = mysql_query("SELECT * FROM article");

$rows = [];
while ($row = mysql_fetch_assoc($res)) {
    $rows[] = $row;
}

echo json_encode($rows);

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

Nigel Ren 21.07.2020 09:55

НАКОНЕЦ ... кто-то добавляет ценность этой странице! Еще 44 УФ, и исследователи могут действительно увидеть этот драгоценный камень.

mickmackusa 11.10.2020 19:33

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