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

304

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

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

Ответы:

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);
ddavtian
источник
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";
        }
aashima
источник
9

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

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

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

Pär

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);
?>
ferreirabraga
источник
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
GEAR4
источник
Остерегайтесь того, что GROUP_CONCAT()ограничено group_concat_max_len.
eggyal
4

мы могли бы упростить ответ Паоло Бергантино, как это

$sth = mysql_query("SELECT ...");
print json_encode(mysql_fetch_assoc($sth));
jrran90
источник
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

DishantPatel
источник
3

Еще одна опция, использующая цикл FOR:

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

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

NGix
источник
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);
user3172285
источник
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);
Bineesh
источник
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);
inrsaurabh
источник
0
$rows = json_decode($mysql_result,true);

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

AMG Sistemas y Desarrollo
источник
-3

$sql = "SELECT JSON_ARRAYAGG(JSON_OBJECT('id', tbl.id)) FROM table tbl WHERE... "; 

//And get first row :) 

Андрей Машуков
источник