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

  • Автор темы Almass
  • Обновлено
  • 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($кон);
    ?>

Almass


Рег
21 Nov, 2009

Тем
87

Постов
171

Баллов
616
  • 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

Тем
83

Постов
182

Баллов
657
  • 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

Тем
85

Постов
203

Баллов
638
  • 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'");
 

Tileroessedly10


Рег
20 Jan, 2012

Тем
62

Постов
200

Баллов
510
  • 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

Тем
74

Постов
187

Баллов
587
  • 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

Тем
96

Постов
185

Баллов
685
  • 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

Тем
72

Постов
195

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

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

Вам необходимо следовать лучшим практикам: лучший способ — использовать параметризованные запросы PDO вместо mysqli_query или, по крайней мере, очищать ввод (с помощью filter_var и т. д.). Даже простой

 $id = intval($_GET['ticket_id']);


PHP: лучше, чем вставлять необработанное значение $_GET.
 

Den_rad


Рег
01 Jan, 2011

Тем
82

Постов
215

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




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

Bonec


Рег
25 Oct, 2011

Тем
83

Постов
187

Баллов
622
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно