JSON เข้ารหัสผลลัพธ์ MySQL


304

ฉันจะใช้json_encode()ฟังก์ชันกับผลลัพธ์การสืบค้น MySQL ได้อย่างไร ฉันต้องวนซ้ำแถวหรือฉันสามารถใช้มันกับวัตถุผลลัพธ์ทั้งหมดหรือไม่


1
ฉันรู้ว่านี่เป็นคำถามที่เก่ามาก แต่ไม่มีใครแสดงทางเลือกที่ง่ายที่สุดในการแก้ไขปัญหาจำนวนเต็มที่แสดงเป็นสตริง @mouckatron เสนอธง JSON_NUMERIC_CHECK json_encode()ในคำตอบด้านล่าง เรียบง่ายและใช้งานได้อย่างมีเสน่ห์! stackoverflow.com/questions/1390983/…
AlexGM

1
มีคำถาม + คำตอบที่ตรงกันเกี่ยวกับปัญหาสตริงประเภทที่: stackoverflow.com/questions/28261613/ …
Marcel 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นี้เป็นที่สะอาดและประชาชนไม่ทราบว่าคอลัมน์ที่แน่นอนมาจากฐานข้อมูล
RobertPitt

14
รหัสนี้ไม่ถูกต้องเข้ารหัสค่าตัวเลขทั้งหมดเป็นสตริง ตัวอย่างเช่นฟิลด์ตัวเลข mySQL ที่เรียกว่า score จะมีค่า JSON เป็น "12" แทนที่จะเป็น 12 (สังเกตเครื่องหมายคำพูด)
ธีโอ

24
@RobertPitt ความปลอดภัยจากการปกปิดชื่อคอลัมน์ของคุณคือความปลอดภัยด้วยความสับสน !
TMS

4
@Tomas จริง แต่รู้ชื่อคอลัมน์ที่แน่นอนทำให้การโจมตีฉีด SQL ง่ายขึ้นมาก
ทิม Seguine

16
@Tim: ถ้าคุณไปถึงจุดที่ชื่อคอลัมน์ของคุณเป็นที่รู้จักก็เป็นอุปสรรคเดียวในการฉีด SQL ที่คุณทำไปแล้วใช่ไหม?
เปาโล Bergantino

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
บ้าน geoengineering

ใช่ตัวอย่างนี้ให้คีย์ต่อแถว
มี.ค.

26

http://www.php.net/mysql_queryพูดว่า " mysql_query()คืนทรัพยากร"

http://www.php.net/json_encodeกล่าวว่าสามารถเข้ารหัสค่าใด ๆ "ยกเว้นทรัพยากร"

คุณต้องวนซ้ำและรวบรวมผลลัพธ์ของฐานข้อมูลในอาเรย์แล้วjson_encodeตามด้วยอาเรย์


2
mysql_query ไม่ส่งคืนชุดผลลัพธ์ นั่นคือสิ่งที่ mysql_fetch * มีไว้สำหรับ
Andy

อืม ... ใช่ ... นั่นคือสิ่งที่เกิดขึ้นซ้ำแล้วซ้ำอีกระหว่าง 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);

นั่นควรทำเคล็ดลับ!

เกณฑ์


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

เราสามารถทำให้Paolo Bergantinoง่ายขึ้นคำตอบเช่นนี้

$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); ช่วยในการสร้างอาร์เรย์มิฉะนั้นจะให้ค่าสุดท้ายในขณะที่ห่วง

งานนี้ชอบวิธีการต่อท้ายของStringBuilderในjava


3

อีกหนึ่งตัวเลือกโดยใช้ FOR loop:

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

ข้อเสียเปรียบเพียงอย่างเดียวคือการวนซ้ำนั้นช้ากว่าเช่นขณะที่หรือโดยเฉพาะอย่างยิ่งหน้า


3

ตัวอย่างเช่น $ result = mysql_query ("SELECT * จากโปรไฟล์ผู้ใช้โดยที่ NAME = 'TESTUSER'");

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

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 ในส่วนของจาวาสคริปต์เช่นนี้:

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.