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






http://www.php.net/mysql_query говорит: «mysql_query() возвращает ресурс».
http://www.php.net/json_encode говорит, что может кодировать любое значение «кроме ресурса».
Вам нужно выполнить итерацию и собрать результаты базы данных в массив, а затем в массив json_encode.
mysql_query не возвращает набор результатов. для этого нужен mysql_fetch *.
Эм ... да ... это то, что происходит при итерации между mysql_query и json_encode. Хороший звонок, Ватсон.
$sth = mysqli_query($conn, "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.
Я бы посоветовал, как и вы, упомянуть, что во время запроса на выбор использовать AS для переименования столбцов во что-то для публики, например SELECT blog_title as title, это чище, и публика не знает, какие именно столбцы из базы данных.
Этот код ошибочно кодирует все числовые значения как строки. Например, числовое поле mySQL с именем score будет иметь значение JSON «12» вместо 12 (обратите внимание на кавычки).
@RobertPitt, безопасность, основанная на сокрытии имен ваших столбцов, - безопасность неизвестностью!
Вы можете использовать мой класс: ajaxian.com/archives/php-based-mysql-to-json-converter
@Tomas правда, но знание точных имен столбцов значительно упрощает атаки SQL-инъекций
@Tim: Если вы дошли до того, что известные имена столбцов - это единственный барьер для SQL-инъекций, который вы уже потеряли, нет?
@PaoloBergtino достаточно честно. Но я бы все же предпочел не раскрывать внутренности. У меня плохое ощущение дизайна от такого интерфейса. У меня есть подозрение, что реальная проблема OP (не указанная в сообщении) может быть лучше решена в любом случае без отправки кучи строк результатов SQL, закодированных как json.
Добавляет ли "$ rows [] = $ r" каждый раз элементы в массив? Я нигде не вижу документированного использования "[]". Спасибо.
@PaoloBergantino Можем ли мы преобразовать данные json в mysql или мы можем запросить данные json?
@RobertPitt, я согласен, но больше на основании определения интерфейса API. Это позволяет изменять базовую таблицу. Не обязательно по соображениям безопасности.
Как затем использовать возвращаемый объект JSON? var obj = JSON.parse (ответ); не дает мне ничего, кроме нуля
Но у меня есть предупреждение: Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given означает, что mysql_query возвращает тип boolean, а не какую-то структуру классов?
@ mr5: Если вы получаете логическое значение для запроса SELECT, это означает, что он не удался. Из документации: For SELECT, SHOW, DESCRIBE, EXPLAIN and other statements returning resultset, mysql_query() returns a resource on success, or FALSE on error.
@ Тео, что тогда делать?
@Theo Есть соответствующий вопрос + ответ о проблеме типа строки по адресу: stackoverflow.com/questions/28261613/…
Убедитесь, что числовые целые числа не преобразуются в строку с помощью JSON Encode. Используйте $ sth = mysqli_query ("SELECT ..."); $ строк = массив (); в то время как ($ r = mysqli_fetch_assoc ($ sth)) {$ rows [] = $ r; } печать json_encode ($ строк, JSON_NUMERIC_CHECK);
Не могли бы вы объяснить использование $ rows [] = $ r; потому что нам не нравится добавлять строку в массив что-то вроде $ row [i] = $ r, потому что мы не будем заменять все данные в массиве, выполняя $ rows [] = $ r;
Это неправильный код. Вы должны сначала получить результат запроса, а затем использовать результат для выборки строк.
По моему опыту, приведенное выше не сработает, прежде чем вы назовете корневой элемент в массиве к чему-то, я не смог получить доступ ни к чему в final json перед этим.
$sth = mysql_query("SELECT ...");
$rows = array();
while($r = mysql_fetch_assoc($sth)) {
$rows['root_name'] = $r;
}
print json_encode($rows);
Это должно делать свое дело!
Попробуйте это, это правильно создаст ваш объект
$result = mysql_query("SELECT ...");
$rows = array();
while($r = mysql_fetch_assoc($result)) {
$rows['object_name'][] = $r;
}
print json_encode($rows);
+1 Кажется, это единственный ответ, который предоставляет JSON в том же формате, что и примеры на json.org/example.
Да, этот пример дает ключ для каждой строки.
Мое простое исправление, чтобы он не ставил речевые метки вокруг числовых значений ...
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;
}
Еще один вариант использования цикла FOR:
$sth = mysql_query("SELECT ...");
for($rows = array(); $row = mysql_fetch_assoc($sth); $rows[] = $row);
print json_encode($rows);
Единственным недостатком является то, что цикл for работает медленнее, чем, например. while или особенно foreach
Извините, это слишком долго после вопроса, но:
$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
$rows = json_decode($mysql_result,true);
так просто, как, что :-)
Например $ result = mysql_query ("ВЫБРАТЬ * ИЗ пользовательских профилей, где ИМЯ = 'ТЕСТУСЕР'");
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);
мы могли бы упростить ответ Паоло Бергантино следующим образом
$sth = mysql_query("SELECT ...");
print json_encode(mysql_fetch_assoc($sth));
Я не думаю, что ты сможешь.
Приведенный ниже код отлично работает здесь!
<?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);
?>
Спасибо .. мой ответ таков:
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";
}
Я решил вот так
$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 в части javascript, например:
obj = JSON.parse(dataX);
$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).'}';
Каким образом этот необъяснимый пост имеет какое-то новое значение для этой страницы? Я вижу ключи без кавычек, устаревшие вызовы mysql_ и созданную вручную строку json. В этом ответе слишком много отрицательных моментов.
<?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 в Ява
У меня такое же требование. Я просто хочу напечатать объект результата в формате 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";
}
В этом ответе используется плохая табуляция кода, и вывод будет отображаться как недопустимый json из-за добавленных символов перед закодированной строкой. Я не вижу, чтобы в этом ответе говорилось что-либо из того, что уже говорится в принятом ответе.
Код:
$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);
Используйте fetchAll(), чтобы получить все строки в виде ассоциативного массива.
$stmt = $pdo->query('SELECT * FROM article');
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($rows);
Когда ваш SQL имеет параметры:
$stmt = $pdo->prepare('SELECT * FROM article WHERE id=?');
$stmt->execute([1]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($rows);
Когда вам нужно изменить ключ таблицы, вы можете использовать цикл foreach и построить массив вручную.
$stmt = $pdo->prepare('SELECT * FROM article WHERE id=?');
$stmt->execute([1]);
$rows = [];
foreach ($stmt as $row) {
$rows[] = [
'newID' => $row['id'],
'Description' => $row['text'],
];
}
echo json_encode($rows);
Используйте fetch_all(), чтобы получить все строки как ассоциативный массив.
$res = $mysqli->query('SELECT * FROM article');
$rows = $res->fetch_all(MYSQLI_ASSOC);
echo json_encode($rows);
Когда ваш SQL имеет параметры, вам необходимо выполнить команду prepare / bind / execute / get_result.
$id = 1;
$stmt = $mysqli->prepare('SELECT * FROM article WHERE id=?');
$stmt->bind_param('s', $id); // binding by reference. Only use variables, not literals
$stmt->execute();
$res = $stmt->get_result(); // returns mysqli_result same as mysqli::query()
$rows = $res->fetch_all(MYSQLI_ASSOC);
echo json_encode($rows);
Когда вам нужно изменить ключ таблицы, вы можете использовать цикл foreach и построить массив вручную.
$stmt = $mysqli->prepare('SELECT * FROM article WHERE id=?');
$stmt->bind_param('s', $id);
$stmt->execute();
$res = $stmt->get_result();
$rows = [];
foreach ($res as $row) {
$rows[] = [
'newID' => $row['id'],
'Description' => $row['text'],
];
}
echo json_encode($rows);
Пожалуйста, обновите как можно скорее до поддерживаемой версии PHP! Пожалуйста, отнеситесь к этому серьезно. Если вам нужно решение с использованием старого API, это можно сделать следующим образом:
$res = mysql_query("SELECT * FROM article");
$rows = [];
while ($row = mysql_fetch_assoc($res)) {
$rows[] = $row;
}
echo json_encode($rows);
Я бы подумал, что примеры повторного ввода результатов будут лучше с псевдонимами столбцов, поскольку это устраняет необходимость в циклах.
НАКОНЕЦ ... кто-то добавляет ценность этой странице! Еще 44 УФ, и исследователи могут действительно увидеть этот драгоценный камень.
Соответствующий вопрос + ответ о проблеме строкового типа: stackoverflow.com/questions/28261613/…