Подготовленный оператор для отображения картинок на странице php при присоединении таблиц - PullRequest
0 голосов
/ 21 марта 2019

В настоящее время у меня есть система входа, где пользователь может зарегистрироваться и войти в систему как пользователь. Моя система основана на PHP PDO.

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

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

Сейчас моя проблема - сделать так, чтобы фотографии отображались на сайте.

Я хочу, чтобы пользователь мог видеть свои СОБСТВЕННЫЕ картинки, которые он загрузил, а не кто-либо другой.

Это то, что у меня есть! :)

Это моя база данных!

СТОЛОВЫЕ ФОТОГРАФИИ со следующими строками:

descPicture

ID

imageFullNamePicture

titlePicture

1026 * идентификатор *

ПОЛЬЗОВАТЕЛИ ТАБЛИЦЫ со следующими строками:

user_email

user_id

user_name

user_password

user_phone

user_zip

Пока это мой КОД:

DBH.INC.PHP

    <?php

$servername = "localhost";
$username = "root";
$password = "";
$dbname = "chhoe17";


try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname",
    $username,
    $password,
    array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));


}
catch(PDOException $e) {
    echo $e->getMessage();
}

UPLOAD.INC.PHP

        <?php
    include "../upload.php";
      //Find the ID of the USER
     // session_start();
      include_once 'dbh.inc.php';


      $pictureTitle = ($_POST["filetitle"]);
      $pictureText = ($_POST["filedesc"]);
    //Fnd ID from the user
      //$user = $_SESSION["u_id"];
      $user = $_SESSION['u_id'];

      $queryUserID = 'SELECT user_id from '.'users'. ' where user_name="'. $user.'";';

      $stmt = $conn -> prepare($queryUserID);

      $stmt -> execute();
      $result = $stmt -> fetch(PDO::FETCH_ASSOC);


      //FileDic
      $fileDirectory = "../uploads/";

      $fileHandled = $fileDirectory . basename($_FILES["file"]["name"]);


      //The "tmp_name" is the temporary location the file is stored in the browser, while it waits to get uploaded
      if (move_uploaded_file($_FILES["file"]["tmp_name"], $fileHandled)) {

          //echo "The file " . basename($_FILES["file"]["name"]) . " has been uploaded.";
          $picture = 'INSERT INTO pictures (titlePicture, descPicture, userid, imageFullNamePicture) 
          VALUES (:titlePicture, :descPicture, :userid, :imageFullNamePicture);';
          $stmt = $conn->prepare($picture);
          $stmt -> bindParam(":titlePicture", $pictureTitle);
          $stmt -> bindParam(":descPicture", $pictureText);
          $stmt -> bindParam(":userid", $user);
          //$stmt -> bindParam(":userid", $result['user_id']);
          $stmt -> bindParam(":imageFullNamePicture", $fileHandled);
          $stmt -> execute(); 
          header("Location: ../upload.php?`Success");
          ?>

      <?php } else {

            header("Location: ../upload.php?Error");
          //echo "Sorry, there was an error uploading your file.";
      }
      header("Location: ../upload.php");


UPLOAD.PHP

    <body>
<section class="main-container">
    <div class="main-wrapper">
        <h2>Manage your pictures</h2>
        <?php
            //display a message and images if logged in!
        if (isset($_SESSION['u_id'])) {
          echo "Upload your pictures";

          echo '<div class="picture-upload">
            <h2>Upload</h2>
            <br>
            <br>
            <br>
            <form action="includes/upload.inc.php" id="upload" method="POST" enctype="multipart/form-data">
              <input type="text" name="filetitle" placeholder="Image title">
              <input type="text" name="filedesc" placeholder="Image description">
              <input type="file" id="file" name="file">
              <button type="submit" name="submit">Upload</button>
            </form>
          </div>';

            }

          if (isset($_SESSION['users'])) {
          echo ' <section class="picture-links">
          <div class="wrapper">
            <h2>Pictures</h2> ';

          $user_data = 'SELECT * FROM' . ' users ' . 'INNER JOIN pictures on users.user_id 
          = pictures.userid WHERE name="' . $_SESSION['u_id'] . '";';
          $stmt = $conn->prepare($user_data);
          $stmt->execute();

          while ($data = $stmt->fetch(PDO::FETCH_ASSOC)) { ?>
            <div class="pictures">
                <a target="file" href=  <?php  ?>>
                    <img class="pic" src=  <?php echo $data['imageFullNamePicture']; ?>></a>
                <div class="titlePicture"><?php echo $data['titlePicture']; ?> <br> </div>
                    <div class="descPicture" >Your description:</div>
                    <div class="text"><?php echo $data['titleDesc']; ?> <br> ?> </div>
            </div>
            <?php
          }


        };
        ?>


    </div>
</section>

</body>
</html>

<?php
include_once 'footer.php';
?> 

Так что проблема в том, что я не могу получить изображения, которые подключаются к текущему вошедшему в систему пользователю, чтобы показать их на странице upload.php

Я надеюсь, что кто-нибудь может мне помочь! :)

EDIT !!!:

Так что у меня сейчас есть этот кусок кода. Он должен заставить пользователя видеть картинки, которые он загрузил в базу данных, но это очень глючно. И это показывает только одну картинку для каждого пользователя. Может кто-нибудь помочь сделать эту работу.

        if (isset($_SESSION['u_id'])) {
          echo ' <section class="picture-links">
      <div class="wrapper">
        <h2>Pictures</h2> ';

          ?>

        <div id="pictures">
            <?php



            $sql = "SELECT * FROM pictures WHERE userid = '{$_SESSION['u_id']}'";

            //$sql = "SELECT * FROM pictures ORDER BY userid DESC LIMIT 20;";
            $stmt = $conn->prepare($sql);
            $stmt->execute();
            $pictures = $stmt->fetchAll();

           // if ($pictures !== null) {
              foreach ($pictures as $pic)
                ?>
            <figure id="<?php echo $pic['id']; ?>">
            <b><figcaption><?php echo $pic["titlePicture"] ?>
            <img src = <?php echo $pic["imageFullNamePicture"]  ?>>
            <?php echo $pic["descPicture"] ?> <br>
            </figure>
            <?php

         // }
        }
        ?>

  </div>

1 Ответ

1 голос
/ 21 марта 2019

Вы извлекаете данные как числовые индексированные массивы PDO::FETCH_NUM, но используете ключи в своем коде:

UPLOAD.INC.PHP

 //instead of PDO::FETCH_NUM
 while ($data = $stmt->fetch(PDO::FETCH_ASSOC)) { ?>
  ...
    <?php echo $data['imageFullNamePicture']; ?>
  ...
  <?php }

Вместо этого используйте PDO::FETCH_ASSOC.

Пожалуйста, не делайте этого с PDO:

 $user_data = 'SELECT * FROM' . ' users ' . 'INNER JOIN pictures on users.user_id 
      = pictures.userid WHERE name="' . $_SESSION['u_id'] . '";';
 $stmt = $conn->prepare($user_data);
 $stmt->execute();

Если кому-то удастся получить данные здесь name="' . $_SESSION['u_id'] . '", вы только что победили всю цель подготовки вашего SQL.Неважно, откуда эти данные пришли, вы никогда не знаете, когда простая ошибка кодирования или что-то еще допустит пользовательские данные в переменную сеанса.

 $user_data = 'SELECT * FROM users INNER JOIN pictures on users.user_id 
      = pictures.userid WHERE name=:u_id';
 $stmt = $conn->prepare($user_data);
 $stmt->execute(['u_id'=>$_SESSION['u_id']]);

Это так просто подготовить правильно.Вам даже не нужно использовать bind с PDO, если только вы не хотите ограничивать тип.Но я думаю, что это также единственный способ сделать LIMIT :limit.Во всяком случае, я почти никогда не использую их.В целом, и PHP, и MySQL достаточно умны, чтобы выполнять правильное приведение типов.

PS.не забудьте позвонить session_start(), если вы используете $_SESSION или ничего из этого не сработает.Я не видел этого в коде, который был опубликован, поэтому я должен упомянуть об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...