使用 php [duplicate] 直接将文件从 html-form 上传到 mariadb 表,在 LONGBLOB 列中

upload file directly from html-form to mariadb table, in a LONGBLOB column, with php [duplicate]

提问人:Ro Man 提问时间:10/25/2023 最后编辑:DharmanRo Man 更新时间:10/25/2023 访问量:38

问:

我尝试在我的 mariadb 数据库 booksummerytable 中从 html-form 上传文件。我在表中、列 student_id 和一个book_id中得到一个 db 条目,但文件条目只是不想传入文件的 LONGBLOB 列。

  <?php
  session_start();
  if ($_SESSION["rolle"] === "schueler" && isset($_GET['id'])) {
      $buchId = $_GET['id'];

      $dbHost = '...';
      $dbUser = '...';
      $dbPass = '...';
      $dbName = '...';

      $conn = new mysqli($dbHost, $dbUser, $dbPass, $dbName);

      if ($conn->connect_error) {
          die("Verbindung zur Datenbank fehlgeschlagen: " . $conn->connect_error);
      }

      // Wiederholen Sie Ihre Datenbankabfrage, um die Buchinformationen zu erhalten
      $sql = "SELECT title FROM buecher WHERE id = ?";
      $stmt = $conn->prepare($sql);
      $stmt->bind_param("i", $buchId);
      $stmt->execute();
      $result = $stmt->get_result();

      if ($result->num_rows == 1) {
          $row = $result->fetch_assoc();
          $buchtitel = $row['title'];

          // Hier fügen wir das Formular zum Hochladen der Zusammenfassung hinzu
          echo '<h2>Zusammenfassung für das Buch: ' . $buchtitel . '</h2>';
          echo '<form action="upload_zusammenfassung.php" method="post" enctype="multipart/form-data">';
          echo '    <input type="file" name="zusammenfassung" id="zusammenfassung">';
          echo '    <input type="hidden" name="buch_id" value="' . $buchId . '">';
          echo '    <input type="submit" value="Zusammenfassung hochladen">';
          echo '</form>';
      } else {
          echo "Buch nicht gefunden.";
      }

      $stmt->close();
  }
  ?>

Anothe 文件,db-entry 发生在哪里

<?php
error_reporting(E_ALL);

session_start();

if ($_SESSION["rolle"] === "schueler" && isset($_FILES['zusammenfassung']) && isset($_POST['buch_id'])) {
    // Verbindung zur Datenbank herstellen
    $dbHost = '...';
    $dbUser = '...';
    $dbPass = '...';
    $dbName = '...';

    $conn = new mysqli($dbHost, $dbUser, $dbPass, $dbName);

    if ($conn->connect_error) {
        die("Verbindung zur Datenbank fehlgeschlagen: " . $conn->connect_error);
    }

    $buchId = $_POST['buch_id'];

    // Dateiinformationen

    $dateiTmpName = $_FILES['zusammenfassung']['tmp_name'];
    $dateiDaten = file_get_contents($dateiTmpName);

    // Schüler-ID aus der Datenbank anhand des Benutzernamens holen
    $schuelerBenutzername = $_SESSION["username"];


    $sqlSchuelerId = "SELECT id_student FROM students WHERE newUsername = ?";
    $stmtSchuelerId = $conn->prepare($sqlSchuelerId);
    $stmtSchuelerId->bind_param("s", $schuelerBenutzername);
    $stmtSchuelerId->execute();
    $stmtSchuelerId->bind_result($schuelerId);
    $stmtSchuelerId->fetch();
    $stmtSchuelerId->close();


        // SQL-Befehl, um die Zusammenfassung in der Datenbank zu speichern
        $sql = "INSERT INTO buchzusammenfassung (idSchueler, idBuch, datei) VALUES (?, ?, ?)";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param("iib", $schuelerId, $buchId, $dateiDaten);

        if ($stmt->execute()) {
            echo "Die Zusammenfassung wurde erfolgreich hochgeladen und in der Datenbank gespeichert.";

        } else {
            echo "Fehler beim Hochladen der Zusammenfassung.";
        }

        $stmt->close();


    $conn->close();
}
?>

PHP 文件 mysqli

评论

0赞 Semyon Bayandin 10/25/2023
人们应该写多少次在数据库中上传文件是非常糟糕的?
0赞 Ro Man 10/26/2023
@SemyonBayandin为什么呢?
0赞 suchislife 10/26/2023
我发现更奇怪的是,用于将这个问题关闭为重复的两个链接都根本没有提及我在下面给出的解决方案。版主说:“哦,看!The word BLOB!我在另一篇帖子上看到了!是的。这是重复的!热闹。。。!
0赞 Semyon Bayandin 10/26/2023
@RoMan 你有没有机会被谷歌禁止?因为它对数据库和服务器本身来说是一个巨大的过载。如果有一天你想创建一个数据库转储,想象一下它会有多大。将文件作为普通文件保存在文件系统中,而不是保存在数据库中,会更好、更安全

答:

0赞 suchislife 10/25/2023 #1

您的代码对 使用了不正确的数据类型绑定。绑定二进制数据时,要使用的正确类型是字符串“s”。LONGBLOB

// Correct the bind_param line to use "s" for binding LONGBLOB data
$stmt->bind_param("iis", $schuelerId, $buchId, $dateiDaten);

评论

0赞 Ro Man 10/26/2023
是的,这就是严谨!谢谢!
-1赞 Sammitch 10/25/2023 #2

只有当您发送的行数据总体上大于 mysql 服务器配置的行数据时,您才真正需要在 mysqli 中使用 /blob 绑定。使用此绑定类型时,必须将值设置为,然后使用 mysqli_stmt::send_long_data(),如下所示:bmax_allowed_packetnull

$stmt = $mysqli->prepare("INSERT INTO messages (message) VALUES (?)");
$null = NULL;
$stmt->bind_param("b", $null);
$fp = fopen("messages.txt", "r");
while (!feof($fp)) {
    $stmt->send_long_data(0, fread($fp, 8192));
}
fclose($fp);
$stmt->execute();

上面的示例是从链接的文档中提取的,但关键点是绑定一个 null 变量,使用小于配置的 [本例中为 8192] 的块大小,并根据需要多次调用以通电数据。max_allowed_packetsend_long_data()

如果您确定您的数据将始终小于,那么更简单的答案是按照 @suchislife 的建议使用 /string 绑定。max_allowed_packets