MySQLの結果をJSONエンコード


304

json_encode()MySQLクエリ結果で関数を使用するにはどうすればよいですか?行を反復処理する必要がありますか、それとも結果オブジェクト全体に適用できますか?


1
これは非常に古い質問であることを知っています。しかし、文字列として表示される整数の問題を修正する最も簡単な方法は誰も示していません。@mouckatronは、json_encode()以下の回答でJSON_NUMERIC_CHECKフラグを提供しています。シンプルで魅力的!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パッケージが必要です- ここで述べたよう

mysqlPHP 5.5.0以降では非推奨です。mysqli代わりに拡張機能http://php.net/manual/en/migration55.deprecated.phpを使用してください。


69
AS列の名前をのようなパブリックに変更するために使用する選択クエリ中にSELECT blog_title as title、これはよりクリーンであり、パブリックはデータベースからの正確な列が何であるかを知らないことをお伝えします。
RobertPitt

14
このコードは、すべての数値を誤って文字列としてエンコードします。たとえば、scoreというmySQL数値フィールドのJSON値は12ではなく "12"になります(引用符に注意してください)。
Theo

24
@RobertPitt、列の名前を隠すことに基づくセキュリティは、あいまいさによるセキュリティです!
TMS

4
@Tomasは正しいが、正確な列名を知っているとSQLインジェクション攻撃がかなり容易になる
Tim Seguine

16
@Tim:列名が判明していることが、すでに失っているSQLインジェクションの唯一の障壁になっている場合は、違いますか?
Paolo Bergantino 2013

44

これを試してください、これはあなたのオブジェクトを適切に作成します

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

 print json_encode($rows);

1
+1これは、json.org / exampleの例と同じ形式でJSONを提供する唯一の回答のようです
ban-geoengineering 2014

はい、この例では行ごとにキーを提供しています。

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 2012年

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

これでうまくいくはずです!

パー


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($ rows、$ row_array); 配列を構築するのに役立ちます。それ以外の場合は、whileループの最後の値を与えます

これはJavaStringBuilderのappendメソッドのように機能します


3

FORループを使用するもう1つのオプション:

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

唯一の欠点は、ループforの方が遅くなることです。


3

たとえば、$ result = mysql_query( "SELECT * FROM userprofiles where NAME = 'TESTUSER'");

1.)$ resultが1行のみの場合。

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

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に返され、JavaScriptの部分で次のようにjson parseを使用して返されます。

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.