Получить несколько строк в MySQL одного запроса в PHP с другим идентификатором

0

У меня разные идентификаторы, я получаю значения этих идентификаторов от пользователей

$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

  • 0
    mysql_ те старые функции mysql_ . Из соображений безопасности используйте подготовленные операторы mysqli с заполнителями. $result не существует.
  • 0
    извините за JSON_encode ($ row);
Теги:
database

3 ответа

0

вы неправильно использовали $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
0

Поместите 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);
}
  • 0
    Уже пробовал, но формат вывода не соответствует
  • 0
    Вы написали json_encode() после цикла for ? Опубликуйте свой неподходящий json в своем вопросе и покажите нам ожидаемый результат.
Показать ещё 1 комментарий
0

Три вещи:

  1. Всегда, всегда, всегда используются подготовленные операторы и связанные параметры при работе с недоверенным (т. $_GET) вводом. Просто сделай это.

  2. Что касается вашей проблемы с JSON, вам нужно только запустить json_encode:

    $results = [];
    for($j=0;$j<count($id);$j++) {
        ...
        while($row=mysql_fetch_array($res)) {
            results[] = ...
        }
    }
    json_encode( $results );
    
  3. Используйте один оператор 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 ) {
        ...
    

    Это более эффективно, чем многократные поездки в базу данных. Для этого надуманного случая это, вероятно, не имеет значения, но в будущем хорошие привычки будут служить вам в долгосрочной перспективе.

  • 0
    я уверен, что OP не знает, что значит $dsn ;)
  • 0
    @ Akintunde007 ярмарка. С другой стороны, OP успешно соединился с функциями mysql* и, будем надеяться, Google отыщет незнакомые детали. Однако меня меньше волнует эта часть вопроса.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню