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

b.allen

Пользователь
Регистрация
31.10.12
Сообщения
1
Реакции
0
Баллы
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($кон);
    ?>
    получить данные из двух таблиц для определенного идентификатора билета и имени пользователя
 

BlackManMS

Пользователь
Регистрация
26.01.11
Сообщения
3
Реакции
0
Баллы
1
Ах да, ок, я обновил код, надеюсь, стал лучше, использую заполнители и 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:
 

kinogrant

Пользователь
Регистрация
17.12.12
Сообщения
5
Реакции
0
Баллы
1
Адрес
Рязань
Мне только что удалось решить эту проблему, изменив запрос на следующий

ВЫБЕРИТЕ 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"]."'
 

dibit

Пользователь
Регистрация
20.01.12
Сообщения
2
Реакции
0
Баллы
1
Ян Хейни

Я думаю, ваша проблема в том, что вы пытаетесь объединить таблицы не в том столбце.
Присоединение должно осуществляться по 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'");
 

ru_vasya

Пользователь
Регистрация
19.11.13
Сообщения
2
Реакции
0
Баллы
1
Я обновил код до приведенного выше значения, и кажется, что все в порядке, когда есть файлы для определенного 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->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:
 

raynar1

Пользователь
Регистрация
08.11.13
Сообщения
3
Реакции
0
Баллы
1
С тех пор я обновил код до следующего, но, похоже, он извлекает имена файлов каждого загруженного файла, а не только имена файлов для каждого конкретного 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()) {
?>


}
?>

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

andreu1

Пользователь
Регистрация
13.05.15
Сообщения
3
Реакции
0
Баллы
1
1. Использование $mysqli->prepare — это движение в правильном направлении, но оно не завершено. Передача SQL в виде готовой к использованию строки, как вы, не имеет никакой разницы с mysqli_query и не препятствует возможному внедрению SQL. Например, кажется, что с помощью этого простого ввода ваш SQL вернет все билеты, просто вставьте эту тестовую строку в начало вашего скрипта и проверьте результаты:

Код:
if($result->num_rows > 0)
{
}
else
echo 'No rows';

PHP: для настоящий параметризованный запрос, проверьте примеры в документация для mysqli_prepare, ваш SQL должен содержать заполнители (?) вместо значений, а значения параметров должны передаваться черезbind_param.
2. Вы используете выход('Нет строк'); который останавливает выполнение скрипта и вывод нижнего колонтитула. Вам нужно изменить свою логику:
$_GET['ticket_id'] = "0' or '1";
PHP:
 

den_rad

Пользователь
Регистрация
01.01.70
Сообщения
3
Реакции
0
Баллы
1
Адрес
Россия
Просто замечание к вашему коду. Я настоятельно рекомендую не вставлять необработанные значения $_GET или любые другие значения, введенные пользователем, непосредственно в SQL-запросы, поскольку они могут быть использованы для атак с использованием SQL-инъекций. Вам необходимо следовать лучшим практикам: лучший способ — использовать параметризованные запросы PDO вместо mysqli_query или, по крайней мере, очищать ввод (с помощью filter_var и т. д.). Даже простой
$id = intval($_GET['ticket_id']);
PHP: лучше, чем вставлять необработанное значение $_GET.
 

bonec

Пользователь
Регистрация
25.10.11
Сообщения
6
Реакции
0
Баллы
1
Попробуйте это, чтобы удалить ошибку, которую вы получаете: «имя_файла» не определено.

if($result->num_rows > 0){
while($row=$result->fetch_array(MYSQLI_ASSOC)){
?>



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