Наличие двух запросов в одном JSON?

0

Я пытаюсь выбрать все из двух таблиц и отображать их через JSON. Вот мой пример:

 <?php
// Create connection
$conn = new mysqli("localhost", "root", "****", "user");

if ($conn->connect_error) {

 die("Connection failed: " . $conn->connect_error);
} 
 // Getting the received JSON into $json variable.
 $json = file_get_contents('php://input');

 // decoding the received JSON and store into $obj variable.
 $obj = json_decode($json,true);

// Populate Username from JSON $obj array and store into $usnername.
$username = $_GET['username'];

$sql = "SELECT * FROM users  WHERE username = '$username'";
$usql = "SELECT * FROM user_images  WHERE username = '$username'";

$result = $conn->query($sql, $usql);

if ($result->num_rows >0) {


 while($row[] = $result->fetch_assoc()) {

 $tem = $row;

 $json = json_encode($tem);


 }

} else {
 echo  "No Results Found.";
}
 echo $json;
$conn->close();
?>

Я не слишком уверен, что это правильный путь для выполнения моей задачи, но я смотрел на другие вопросы, и никто не был в том же формате, что и мой. Кроме того, я знаю, что это уязвимо для инъекций SQL, это, например, цели.

пользователи Таблица:

-id - имя пользователя -profilepic

1 Bill image.png

2 Sally cats.png

таблица user_images:

-id - имя пользователя -posts

1 Билл Пища

2 Билл Спорт

3 Салли Кофе

  • 2
    Прежде всего, вы не можете передать два запроса за один вызов в $conn->query() . Второй параметр - $resultmode и используется для передачи определенных параметров для выполнения запроса. Но чтобы действительно помочь вам, нам нужно знать: как вы ожидаете, что будет выглядеть результат?
  • 0
    Я хочу отобразить некоторую информацию о пользователе, такую как изображение профиля, и отобразить все сообщения пользователя. И я действительно не могу использовать JOIN потому что это будет отображать изображение профиля несколько раз. @TobiasXy
Теги:
mysqli

2 ответа

3

Я знаю, что вы упомянули об этом в своем вопросе, но это repeating-, это уязвимо для SQL-инъекций, потому что вы ссылаетесь на ввод пользователя из массива $_GET непосредственно в ваш SQL-запрос без предварительной дезинфекции или, лучше, с помощью подготовленных операторов.

$result = $conn->query($sql, $usql);
Функция mysqli::query принимает один запрос и необязательный параметр MYSQLI_STORE_RESULT который вы неправильно указываете, передавая второй оператор SQL, $usql - поэтому это не сработает.

Вместо этого вы должны выполнить JOIN в двух таблицах в том же запросе. Таким образом, объединение ваших запросов будет выглядеть примерно так:

$sql = "SELECT * FROM users 
LEFT JOIN user_images ON user_images.username = user.username 
WHERE username = '$username'";

Или, как подготовленное выражение:

$prepared_statement = $conn->prepare("SELECT * FROM users LEFT JOIN user_images ON user_images.username = user.username WHERE username = ?");
$prepared_statement->bind_param("s", $username);
$result = $prepared_statement->execute();

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

Изменить После рассмотрения новой информации лучше всего сделать следующее:

$sql = "SELECT * FROM users  WHERE username = '$username'";
$usql = "SELECT * FROM user_images  WHERE username = '$username'";

$users_result = $conn->query($sql);

if ($users_result->num_rows > 0) {
    while($user = $users_result->fetch_assoc()) {
        $posts_array = array();
        $posts_result = $conn->query($usql);
        if ($posts_result->num_rows > 0) {
            while($post = $posts_result->fetch_assoc()) {
                $posts_array[] = array(
                    "id" => $post['id'],
                    "post" => $post['post']
                );
            }
        }
        $response = array(
            "id" => $user['id'],
            "username" => $user['username'],
            "profilepic" => $user['profilepic'],
            "posts" => $posts_array
        );
        $json = json_encode($response);
        echo $json;
    }
} else {
    echo  "No Results Found.";
}
$conn->close();
  • 0
    Спасибо, но главное в JOIN состоит в том, что он будет отображать все сообщения пользователя и включать, например, изображение профиля в зависимости от того, сколько сообщений. Я пытаюсь добиться чего-то вроде этого: stackoverflow.com/questions/17911533/… @Jesse
  • 0
    В основном, там, где отображаются все сообщения пользователя ( user_images ), но однажды будет отображаться изображение профиля. ( users )
Показать ещё 7 комментариев
0

Попробуй это

<?php

//$conn = ... connect to database

$sql = "SELECT * FROM users  WHERE username = '$username'";
$usql = "SELECT * FROM user_images  WHERE username = '$username'";

$queryTableOne = mysqli_query($conn, $sql);
$queryTableTwo = mysqli_query($conn, $usql);

$json = mysqli_fetch_array($queryTableOne, MYSQLI_ASSOC);

$json2 = array();
while ($row = mysqli_fetch_assoc($queryTableTwo)) {
    $json2[] = array(
        'your_field1' => $row["your_field1"],
        'your_field2' => $row["your_field2"],
        'your_field3' => $row["your_field3"],
        //...etc
    );
}

$json['user_images'] = $json2;
echo json_encode($json);

?>

Ссылка


Но использование JOIN - лучший способ.

Ещё вопросы

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