JSON koduje wyniki MySQL

304

Jak korzystać z json_encode()funkcji z wynikami zapytań MySQL? Czy muszę iterować przez wiersze, czy mogę po prostu zastosować go do całego obiektu wyników?

Trick Jarrett
źródło
1
Wiem, że to bardzo stare pytanie. Ale nikt nie pokazuje najprostszej alternatywy dla rozwiązania problemu liczb całkowitych wyświetlanych jako łańcuchy. @mouckatron oferuje flagę JSON_NUMERIC_CHECK json_encode()w odpowiedzi poniżej. Prosty i działa jak urok! stackoverflow.com/questions/1390983/…
AlexGM
1
Istnieje pasujące pytanie + odpowiedź dotyczące problemu typu ciągu na stronie: stackoverflow.com/questions/28261613/…
Marcel Ennix

Odpowiedzi:

493
$sth = mysqli_query("SELECT ...");
$rows = array();
while($r = mysqli_fetch_assoc($sth)) {
    $rows[] = $r;
}
print json_encode($rows);

Ta funkcja json_encodewymaga PHP> = 5.2 i pakietu php-json - jak wspomniano tutaj

UWAGA : mysqljest przestarzałe od PHP 5.5.0, mysqlizamiast tego użyj rozszerzenia http://php.net/manual/en/migration55.deprecated.php .

Paolo Bergantino
źródło
69
Radzę równie dobrze, jak wspomnieć, że podczas kwerendy wybierz, aby użyć ASdo zmiany nazwy kolumn na coś publicznego, na przykład SELECT blog_title as titlejest to czystsze, a społeczeństwo nie wie, jakie dokładnie kolumny pochodzą z bazy danych.
RobertPitt,
14
Ten kod błędnie koduje wszystkie wartości liczbowe jako ciągi. Na przykład pole liczbowe mySQL o nazwie score miałoby wartość JSON „12” zamiast 12 (zauważ cudzysłowy).
Theo
24
@RobertPitt, bezpieczeństwo oparte na ukrywaniu nazw twoich kolumn to bezpieczeństwo przez zapomnienie !
TMS
4
@Tomas prawda, ale znając dokładnej nazwy kolumn sprawia, że ataki SQL Injection znacznie łatwiejsze
Tim Seguine
16
@Tim: Jeśli dochodzisz do punktu, w którym nazwy kolumn są jedyną barierą dla zastrzyku SQL, którą już straciłeś, nie?
Paolo Bergantino,
44

Wypróbuj to, spowoduje to prawidłowe utworzenie obiektu

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

 print json_encode($rows);
ddavtian
źródło
1
+1 To wydaje się być jedyną odpowiedzią, która zapewnia JSON w tym samym formacie, co przykłady na json.org/example .
zakaz geoinżynierii
Tak, w tym przykładzie podano klucz dla wiersza.
Mar
26

http://www.php.net/mysql_query mówi „ mysql_query()zwraca zasób”.

http://www.php.net/json_encode mówi, że może zakodować dowolną wartość „z wyjątkiem zasobu”.

Musisz iterować i zbierać wyniki bazy danych w tablicy, a następnie json_encodew tablicy.

Hugh Bothwell
źródło
2
mysql_query nie zwraca zestawu wyników. po to jest mysql_fetch *.
Andy,
Um ... tak ... to jest to, co dzieje się w iteracji między mysql_query i json_encode. Dobra rozmowa, Watson.
Hugh Bothwell
17

Dzięki temu bardzo mi pomogło. Mój kod:

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

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

echo json_encode($rows);
Tokeny
źródło
ten da nam tablicę zawierającą; 1) pusty nawias kwadratowy 2), a następnie nawias klamrowy zawierający nasze wiersze wyników, co to różni się od drugiego?
gumuruh
11

Dzięki .. moja odpowiedź brzmi:

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
źródło
9

Z mojego doświadczenia wynika, że ​​powyższe nie zadziała, zanim nazwiesz element root w tablicy na coś, nie byłem w stanie uzyskać dostępu do niczego w ostatnim jsonie wcześniej.

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

To powinno wystarczyć!

Par

Par
źródło
8

Poniższy kod działa tutaj dobrze!

<?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
źródło
5

Moja prosta poprawka, aby go zatrzymać, umieszczając znaki mowy wokół wartości liczbowych ...

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;
}   
James
źródło
5

Niestety, jest to bardzo długo po pytaniu, ale:

$sql = 'SELECT CONCAT("[", GROUP_CONCAT(CONCAT("{username:'",username,"'"), CONCAT(",email:'",email),"'}")), "]") 
AS json 
FROM users;'
$msl = mysql_query($sql)
print($msl["json"]);

Po prostu:

"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
źródło
Uwaga, GROUP_CONCAT()jest ograniczony przez group_concat_max_len.
eggyal
4

moglibyśmy uprościć odpowiedź Paolo Bergantino w ten sposób

$sth = mysql_query("SELECT ...");
print json_encode(mysql_fetch_assoc($sth));
jrran90
źródło
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); pomagają budować tablice, w przeciwnym razie daje ostatnią wartość w pętli while

działa to jak metoda dołączania StringBuilder w Javie

DishantPatel
źródło
3

Jeszcze jedna opcja za pomocą pętli FOR:

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

Jedyną wadą jest to, że pętla dla jest wolniejsza niż np. Podczas lub szczególnie w przypadku Foreach

NGix
źródło
3

Na przykład $ wynik = mysql_query („WYBIERZ * Z profili użytkowników, gdzie NAZWA =„ TESTUSER ””);

1.) jeśli wynik $ to tylko jeden wiersz.

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

2.) jeśli wynik $ jest większy niż jeden wiersz. Musisz iterować wiersze i zapisać je w tablicy, a następnie zwróci json z tablicą.

$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);
Jyoti Prakash
źródło
3

Mam takie same wymagania. Chcę tylko wydrukować obiekt wynikowy w formacie JSON, więc używam poniższego kodu. Mam nadzieję, że coś w tym znajdziesz.

// 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";
}
Darshan Dhoriya
źródło
3

Sprawdź poniższy kod, aby użyć mysql_fetch i json_encode. Będziesz musiał powtarzać wiersze, ale jeśli użyjesz mysqli, sytuacja się zmieni

$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);
użytkownik3172285
źródło
3

Tak rozwiązałem

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

To zostanie zwrócone do ajax jako zestaw wyników i przy użyciu parsowania json w części javascript w następujący sposób:

obj = JSON.parse(dataX);
Bineesh
źródło
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).'}';
Bijender Singh Shekhawat
źródło
2

Kod:

$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
źródło
0
$rows = json_decode($mysql_result,true);

tak proste jak to :-)

AMG Sistemas y Desarrollo
źródło
-3

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

//And get first row :) 

Andrey Mashukov
źródło