Я пытаюсь выбрать все из двух таблиц и отображать их через 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 Салли Кофе
Я знаю, что вы упомянули об этом в своем вопросе, но это 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();
JOIN
состоит в том, что он будет отображать все сообщения пользователя и включать, например, изображение профиля в зависимости от того, сколько сообщений. Я пытаюсь добиться чего-то вроде этого: stackoverflow.com/questions/17911533/… @Jesse
user_images
), но однажды будет отображаться изображение профиля. ( users
)
Попробуй это
<?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
- лучший способ.
$conn->query()
. Второй параметр -$resultmode
и используется для передачи определенных параметров для выполнения запроса. Но чтобы действительно помочь вам, нам нужно знать: как вы ожидаете, что будет выглядеть результат?JOIN
потому что это будет отображать изображение профиля несколько раз. @TobiasXy