У меня разные идентификаторы, я получаю значения этих идентификаторов от пользователей
$id=array();
$id[0]=$_GET["id0"];
$id[1]=$_GET["id1"];
$id[2]=$_GET["id2"];
теперь для извлечения данных из базы данных я использую следующий запрос:
for($j=0;$j<count($id);$j++)
{
$res=mysql_query("SELECT * FROM mutable WHERE id='$id[$j]'")
while($row=mysql_fetch_array($res))
{
$row[]=array("email"=>$row[2],"name"=>$row[3],"address"=>$row[5]);
echo JSON_encode($row);
}
}
теперь я получаю правильный результат из этого запроса, используя for loop, но результат не в правильном формате JSON, есть ли способ сделать это более эффективно и получить правильный результат в массиве JSON и объектном формате JSON
вы неправильно использовали $row
, объявляете переменную массива вне цикла, как
$json_response = array();
for($j=0;$j<count($id);$j++) {
$res=mysql_query("SELECT * FROM mutable WHERE id='$id[$j]'")
while($row=mysql_fetch_array($res)) {
$json_response[]=array("email"=>$row[2],"name"=>$row[3],"address"=>$row[5]);
echo json_encode($json_response); // not good to echo here
}
}
// echo json_encode($json_response); // ideally echo should be here
Поместите json_encode()
вне ваших циклов.
Позвольте модернизировать и усовершенствовать вещи...
* К сожалению, подготовленные заявления, которые используют предложение IN
, страдают от свертки. pdo
не страдает одинаково.
Код: (непроверенный)
if(isset($_GET['id0'],$_GET['id1'],$_GET['id2'])){
$params=[$_GET['id0'],$_GET['id1'],$_GET['id2']]; // array of ids (validation/filtering can be done here)
$count=count($params); // number of ids
$csph=implode(',',array_fill(0,$count,'?')); // comma-separated placeholders
$query="SELECT * FROM mutable WHERE id IN ($csph)";
$stmt=$mysqli->prepare($query); // for security reasons
array_unshift($params,str_repeat('s',$count)); // prepend the type values string
$ref=[]; // add references
foreach($params as $i=>$v){
$ref[$i]=&$params[$i]; // pass by reference as required/advised by the manual
}
call_user_func_array([$stmt,'bind_param'],$ref);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_array(MYSQLI_NUM))
$rows=["email"=>$row[2],"name"=>$row[3],"address"=>$row[5]];
}
$stmt->close();
echo json_encode($rows);
}
json_encode()
после цикла for
? Опубликуйте свой неподходящий json в своем вопросе и покажите нам ожидаемый результат.
Три вещи:
Всегда, всегда, всегда используются подготовленные операторы и связанные параметры при работе с недоверенным (т. $_GET
) вводом. Просто сделай это.
Что касается вашей проблемы с JSON, вам нужно только запустить json_encode
:
$results = [];
for($j=0;$j<count($id);$j++) {
...
while($row=mysql_fetch_array($res)) {
results[] = ...
}
}
json_encode( $results );
Используйте один оператор SQL, поскольку у вас есть известное количество идентификаторов для сбора:
$dbh = new PDO($dsn, $user, $password);
$sql = "SELECT * FROM mutable WHERE id IN (?, ?, ?)";
$sth = $dbh->prepare( $sql );
foreach ( $sth->execute( [$_GET['id0'], $_GET['id1'], $_GET['id2']] ) as $row ) {
...
Это более эффективно, чем многократные поездки в базу данных. Для этого надуманного случая это, вероятно, не имеет значения, но в будущем хорошие привычки будут служить вам в долгосрочной перспективе.
$dsn
;)
mysql*
и, будем надеяться, Google отыщет незнакомые детали. Однако меня меньше волнует эта часть вопроса.
mysql_
те старые функцииmysql_
. Из соображений безопасности используйте подготовленные операторы mysqli с заполнителями.$result
не существует.