提问人:Ro Man 提问时间:10/25/2023 最后编辑:DharmanRo Man 更新时间:10/25/2023 访问量:38
使用 php [duplicate] 直接将文件从 html-form 上传到 mariadb 表,在 LONGBLOB 列中
upload file directly from html-form to mariadb table, in a LONGBLOB column, with php [duplicate]
问:
我尝试在我的 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();
}
?>
答:
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(),
如下所示:b
max_allowed_packet
null
$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_packet
send_long_data()
如果您确定您的数据将始终小于,那么更简单的答案是按照 @suchislife 的建议使用 /string 绑定。max_allowed_packet
s
评论