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


304

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


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

Ответы:


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
Я бы также посоветовал вам упомянуть, что во время запроса select, который нужно использовать, ASчтобы переименовать столбцы в нечто общедоступное, например SELECT blog_title as title, это чище, и публика не знает, какие именно столбцы взяты из базы данных.
Роберт Питт

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

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

4
@Tomas верно, но знание точных имен столбцов значительно облегчает атаки 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 .
запрет геоинженерии

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

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

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


3

Например, $ result = mysql_query ("SELECT * FROM userprofiles, где NAME = 'TESTUSER'");

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

$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 parse в части 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.