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


304

Як використовувати json_encode()функцію з результатами запитів MySQL? Чи потрібно мені перебирати рядки чи я можу просто застосувати його до всього об'єкта результатів?


1
Я знаю, що це дуже старе питання. Але ніхто не показує найпростішу альтернативу виправленню проблеми цілих чисел, що відображаються як рядки. @mouckatron пропонує прапор JSON_NUMERIC_CHECK json_encode()у відповіді нижче. Просто і це працює як шарм! stackoverflow.com/questions/1390983 / ...
AlexGM

1
Існує комбінаційної питання + відповідь щодо строкового типу -завдання на: stackoverflow.com/questions/28261613 / ...
Марсель Ennix

Відповіді:


493
$sth = mysqli_query("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 .


69
Я б радив вам також зазначити, що під час запиту вибору використовувати ASдля перейменування стовпців на щось загальнодоступне, наприклад SELECT blog_title as title, це чистіше, і громадськість не знає, які саме стовпці є з бази даних.
РобертПітт

14
Цей код помилково кодує всі числові значення як рядки. Наприклад, числове поле mySQL під назвою оцінка матиме значення JSON "12" замість 12 (зверніть увагу на лапки).
Тео

24
@RobertPitt, безпека, заснована на приховуванні назв ваших стовпців, - це безпека від неясності !
TMS

4
@ Тома правда, але знаючи точні назви стовпців значно спрощує атаки ін'єкцій SQL
Тім Сегуїн

16
@Tim: Якщо ви добираєтесь до того, що відомі імена ваших стовпців - це єдиний бар'єр для інжекції SQL, який ви вже втратили, ні?
Паоло Бергантіно

44

Спробуйте це, це створить ваш об’єкт належним чином

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

 print json_encode($rows);

1
+1 Це здається єдиною відповіддю, яка надає JSON у тому ж форматі, що і приклади на json.org/example .
заборона-геоінженерія

Так, цей приклад дає ключ на рядок.
березня

26

http://www.php.net/mysql_query говорить " mysql_query()повертає ресурс".

http://www.php.net/json_encode каже, що може кодувати будь-яке значення "крім ресурсу".

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


2
mysql_query не повертає набір результатів. ось для чого саме mysql_fetch *.
Енді

Гм ... так ... ось що йде в ітерації, між mysql_query та json_encode. Гарний дзвінок, Ватсоне.
Х'ю Ботвелл

17

Спасибі це мені дуже допомогло. Мій код:

$sqldata = mysql_query("SELECT * FROM `$table`");

$rows = array();
while($r = mysql_fetch_assoc($sqldata)) {
  $rows[] = $r;
}

echo json_encode($rows);

цей, дасть нам масив, що містить; 1) порожня квадратна дужка 2) за якою фігурною дужкою, що містить наші повернуті рядки результатів, чим це відрізняється від іншого?
gumuruh

11

Дякую .. моя відповідь іде:

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";
        }

9

Наведене вище не спрацює, на моєму досвіді, перш ніж ви щось назвете кореневий елемент у масиві, я до цього не зміг отримати доступ до остаточного json.

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

Це повинно зробити трюк!

Pär


8

Код нижче працює добре!

<?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);
?>

5

Моє просте виправлення, щоб зупинити його, ставлячи мовленнєві позначки навколо числових значень ...

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;
}   

5

Вибачте, це надзвичайно довго після запитання, але:

$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

4

ми могли б спростити відповідь Паоло Бергантіно, як це

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

4
<?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 в Java


3

Ще один варіант використання циклу FOR:

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

Єдиним недоліком є ​​те, що цикл для нього проходить повільніше, наприклад, наприклад, під час роботи або особливо передбачати


3

Наприклад, $ result = mysql_query ("SELECT * FROM userprofiles where NAME = 'TESTUSER'");

1.) якщо $ результат - лише один рядок.

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

2.) якщо результат $ більше, ніж один рядок. Вам потрібно перебрати рядки та зберегти їх у масив та повернути 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);

3

У мене така ж вимога. Я просто хочу надрукувати результат результату у форматі 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";
}

3

Перевірте наведений нижче код на використання mysql_fetch та json_encode. Вам потрібно буде повторити рядки, але якщо ви будете використовувати mysqli, ситуація зміниться

$kt_query="SELECT * FROM tbl_xxx";
$kt_result = mysql_query($kt_query) or die('Query failed: ' . mysql_error());
$rows= array();
while($sonuc=mysql_fetch_assoc($kt_result))
{
    $rows[]=$sonuc;
}
print json_encode($rows);

3

Я вирішив так

$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);

2
$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).'}';

2

Код:

$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);


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.