получить данные из двух таблиц для определенного идентификатора билета и имени пользователя

  • Автор темы b.allen
  • 61
  • Обновлено
  • 15, May 2024
  • #1
Я пытаюсь понять, как получить данные из двух разных таблиц в одной базе данных и получить имена файлов, загруженных в базу данных, для определенного идентификатора билета и имени пользователя.

Я сам пробовал PHP-код, и мне удалось INNER JOIN двух таблиц, но на странице php он показывает все загруженные файлы для конкретного пользователя, а не только для конкретного идентификатора билета и имени пользователя вместе, и выглядит так: это циклично и повторяется.

Ниже приведен код, который у меня сейчас есть

$con = mysqli_connect("localhost","dbuser","dbpass","dbname");

если (mysqli_connect_errno()) {

echo «Невозможно подключиться к MySQL!». mysqli_connect_error();

}

$sqli = "ВЫБЕРИТЕ support_tickets.ticket_id, support_tickets.file_name, support_tickets.user_name FROM support_tickets INNER JOIN support_ticket_files ON support_tickets.user_name=support_ticket_files.user_name

ГДЕ support_tickets.ticket_id = 'ticket_id' И support_tickets.user_name = '".$_SESSION["user_name"]."'";

$res = mysqli_query($con, $sqli);

while ($row = mysqli_fetch_array($res)) {

echo "


  • ";
    echo "
  • Загрузить
    ";
    }
    mysqli_close($кон);
    ?>

b.allen


Рег
31 Oct, 2012

Тем
1

Постов
1

Баллов
11
  • 18, May 2024
  • #2
Ах да, ок, я обновил код, надеюсь, стал лучше, использую заполнители и bind_param и теперь получил вывод нижнего колонтитула, если нет вложенных файлов, но возникла одна проблема, я поместил сообщение об ошибке ниже Примечание.

Неопределенный индекс: имя_файла в /home/itdonerightco/public_html/account/view-support-ticket.php в строке 245. Обновленный код приведен ниже
 $_GET['ticket_id'] = "0' or '1";
PHP: я немного не знал, куда поставить строку
 <?php $mysqli = new mysqli("localhost", "user", "password", "dbname"); if ($mysqli->connect_errno) { echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error; if(isset($_GET['ticket_id'])){ $ticket_id =$_GET['ticket_id']; if(isset($_GET['file_name'])){ $filename =$_GET['file_name']; ?> <?php $stmt = $mysqli->prepare("SELECT support_tickets.ticket_id, support_ticket_files.file_name, support_tickets.user_name FROM support_tickets INNER JOIN support_ticket_files ON support_tickets.ticket_id=support_ticket_files.ticket_id WHERE support_tickets.ticket_id = ? AND support_tickets.user_name = ?"); $stmt->bind_param("is", $ticket_id, $username); $stmt->execute(); $result = $stmt->get_result(); if($result->num_rows > 0) { ?> <ul class="nav"> <li><a href="support-ticket-images/<?php echo $row['file_name']; ?>" class="noline" download="download"><?php echo $row['file_name']; ?></a></li> </ul> <?php } else echo 'No Files'; ?>
PHP:
 

BlackManMS


Рег
26 Jan, 2011

Тем
0

Постов
3

Баллов
3
  • 21, May 2024
  • #3
Мне только что удалось решить эту проблему, изменив запрос на следующий

ВЫБЕРИТЕ support_tickets.ticket_id, support_tickets.file_name, support_tickets.user_name ИЗ support_tickets ВНУТРЕННЕЕ ПРИСОЕДИНЕНИЕ support_ticket_files ON support_tickets.user_name=support_tickets.user_name

WHERE support_tickets.ticket_id = ".$_GET['ticket_id']". И support_tickets.user_name = '".$_SESSION["user_name"]."'
 

kinogrant


Рег
17 Dec, 2012

Тем
2

Постов
5

Баллов
25
  • 04, Jun 2024
  • #4
Ян Хейни

Я думаю, ваша проблема в том, что вы пытаетесь объединить таблицы не в том столбце.

Присоединение должно осуществляться по Ticket_id, а не по имени пользователя.

Если вы уже храните Ticket_id в таблице support_ticket_files, попробуйте следующий запрос:

Если нет, то вам придется создать новый столбец Ticket_id в support_ticket_files, заполнить его соответствующими данными, а затем выполнить приведенный ниже запрос.

$stmt = $mysqli->prepare("ВЫБРАТЬ support_tickets.ticket_id, support_tickets_files.file_name, support_tickets.user_name ОТ support_tickets ВНУТРЕННЕЕ ПРИСОЕДИНЕНИЕ support_ticket_files ВКЛ.

support_tickets.ticket_id=support_ticket_files.ticket_id ГДЕ support_tickets.ticket_id ='$ticket_id' И support_tickets.user_name ='$username'");
 

dibit


Рег
20 Jan, 2012

Тем
0

Постов
2

Баллов
2
  • 07, Jun 2024
  • #5
Я обновил код до приведенного выше значения, и кажется, что все в порядке, когда есть файлы для определенного Ticket_id, но когда файлов нет, он говорит, что строк нет, и это нормально, но остальная часть сайта, например нижний колонтитул, не отображается.

Обновленный код приведен ниже
 <?php

$mysqli = new mysqli("localhost", "user", "password", "dbname");

if ($mysqli->connect_errno) {

echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;

}

if(isset($_GET['ticket_id'])){

$ticket_id =$_GET['ticket_id'];

}

if(isset($_GET['file_name'])){

$filename =$_GET['file_name'];

}

?>

<?php

$stmt = $mysqli->prepare("SELECT

support_tickets.ticket_id, support_ticket_files.file_name, support_tickets.user_name

FROM

support_tickets INNER JOIN support_ticket_files

ON support_tickets.ticket_id=support_ticket_files.ticket_id

WHERE

support_tickets.ticket_id ='$ticket_id' AND

support_tickets.user_name ='$username'");

//$stmt->bind_param("i", $ticket_id);

$stmt->execute();

$result = $stmt->get_result();

if($result->num_rows === 0) exit('No rows');

$row = $result->fetch_assoc();

?>

<ul class="nav">

<li><a href="support-ticket-images/<?php echo $row['file_name']; ?>" class="noline" download="download"><?php echo $row['file_name']; ?></a></li>

</ul>
PHP:
 

ru_vasya


Рег
19 Nov, 2013

Тем
1

Постов
2

Баллов
12
  • 10, Jun 2024
  • #6
С тех пор я обновил код до следующего, но, похоже, он извлекает имена файлов каждого загруженного файла, а не только имена файлов для каждого конкретного Ticket_id.

$mysqli = new mysqli("localhost", "user", "pass", "dbname");

если ($mysqli->connect_errno) {

echo "Не удалось подключиться к MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;

}

if(isset($_GET['user_name'])){

$username =$_GET['user_name'];

}

if(isset($_GET['ticket_id'])){

$ticket_id =$_GET['ticket_id'];

}

if(isset($GET['имяфайла'])){ $filename =$_GET['file_name']; } ?> $stmt = $mysqli->prepare("ВЫБЕРИТЕ support_tickets.ticket_id, support_ticket_files.file_name, support_tickets.user_name FROM support_tickets INNER JOIN support_ticket_files ON support_tickets.user_name=support_ticket_files.user_name

WHERE support_tickets.ticket_id = '$ticket_id' И support_tickets.user_name = '$username'");

$stmt->выполнить(); $stmt -> store_result(); $stmt ->bind_result($ticket_id, $filename, $username); while ($stmt->fetch()) { ?>




} ?> Извините, как мне поместить код в теги кода, чтобы он был на черном фоне, как у вас выше, и его было легче увидеть?
 

raynar1


Рег
08 Nov, 2013

Тем
0

Постов
3

Баллов
3
  • 10, Jun 2024
  • #7
1. Использование $mysqli->prepare — это движение в правильном направлении, но оно не завершено.

Передача SQL в виде готовой к использованию строки, как вы, не имеет никакой разницы с mysqli_query и не препятствует возможному внедрению SQL.

Например, кажется, что с помощью этого простого ввода ваш SQL вернет все билеты, просто вставьте эту тестовую строку в начало вашего скрипта и проверьте результаты:
 
if($result->num_rows > 0)
{
//display results
}
else
echo 'No rows';
PHP: для настоящий параметризованный запрос, проверьте примеры в документация для mysqli_prepare

, ваш SQL должен содержать заполнители (?) вместо значений, а значения параметров должны передаваться черезbind_param. 2. Вы используете выход('Нет строк'); который останавливает выполнение скрипта и вывод нижнего колонтитула.

Вам нужно изменить свою логику:
 $_GET['ticket_id'] = "0' or '1";
PHP:
 

andreu1


Рег
13 May, 2015

Тем
1

Постов
3

Баллов
13
  • 10, Jun 2024
  • #8
Просто замечание к вашему коду.

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

Вам необходимо следовать лучшим практикам: лучший способ — использовать параметризованные запросы PDO вместо mysqli_query или, по крайней мере, очищать ввод (с помощью filter_var и т. д.). Даже простой
 $id = intval($_GET['ticket_id']);
PHP: лучше, чем вставлять необработанное значение $_GET.
 

den_rad


Рег
01 Jan, 2011

Тем
1

Постов
3

Баллов
13
  • 13, Jun 2024
  • #9
Попробуйте это, чтобы удалить ошибку, которую вы получаете: «имя_файла» не определено. if($result->num_rows > 0){ while($row=$result->fetch_array(MYSQLI_ASSOC)){ ?>




}//пока заканчивается здесь }еще{ эхо «Нет файлов»; } ?>
 

bonec


Рег
25 Oct, 2011

Тем
2

Постов
6

Баллов
26
Тем
49554
Комментарии
57426
Опыт
552966

Интересно