【发布时间】:2018-04-25 03:02:00
【问题描述】:
我正在尝试使用 php 将一些信息上传到数据库,我已经能够单独上传图像和文本,但不能一起上传(我的目标)。由于某种原因,图像将进入指定的文件夹,但是由于某种原因,信息不会被放入数据库,并不断向我抛出“失败”的 else 语句!我显然是 php 新手,非常感谢您的帮助!这是我的php代码:
<?php
include_once 'dbh.inc.php';
session_start();
if(isset($_POST['upload'])) {
$file = $_FILES['profileup'];
$fileName = $_FILES['profileup']['name'];
$fileTmpName = $_FILES['profileup']['tmp_name'];
$fileSize = $_FILES['profileup']['size'];
$fileError = $_FILES['profileup']['error'];
$fileType = $_FILES['profileup']['type'];
$Newname = $fileName;
$fileExt = explode('.', $fileName);
$fileActualExt = strtolower(end($fileExt));
$allowed = array('jpg', 'jpeg', 'png');
if (in_array($fileActualExt, $allowed)){
if ($fileError === 0){
if ($fileSize < 10000000000){
$filedest = 'postimages/'.$Newname;
$username = $_SESSION[user];
move_uploaded_file($fileTmpName, $filedest);
header("Location: ../UserProfile.php?suc");
$sql = "INSERT INTO posts (img, ext) VALUES ('$filedest', '$fileActualExt');";
$result = mysqli_query($conn, $sql);
if($result !== false) {
exit;
}else{
echo "fail";
}
}else{
echo "your file was to big";
}
}else{
echo "There was an error uploading your file";
}
}else{
echo "you cant upload files of this type";
}
}else{
header("Location: ../UserProfileSetting.php?fail");
}
?>
【问题讨论】:
-
警告:当使用
mysqli时,您应该使用parameterized queries 和bind_param将用户数据添加到您的查询中。 请勿使用字符串插值或连接来完成此操作,因为您创建了严重的SQL injection bug。 切勿将$_POST、$_GET或任何用户数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。 -
注意:
mysqli的面向对象接口明显不那么冗长,使代码更易于阅读和审核,并且不容易与过时的mysql_query接口混淆。在您对程序风格投入过多之前,值得转换一下。示例:$db = new mysqli(…)和$db->prepare("…")程序接口是 PHP 4 时代引入的mysqliAPI 的产物,不应在新代码中使用。 -
将
header("Location: ../UserProfile.php?suc");移动到if($result !== false){...}块内。 -
@tadman 程序与面向对象的 mysqli 很大程度上取决于个人喜好。我更喜欢过程而不是面向对象的 mysqli 来限制由于糟糕的边缘情况处理而导致方法不存在的情况。我喜欢 mysqli 的一点是它支持类似于旧的 mysql_* 函数的风格,这是我大脑在某些情况下的思考方式。如果我想采用程序风格,我更喜欢使用 PDO,这样可以很容易地在数据库选项之间进行交换。两者都没有错,它是相同的扩展名。
-
@Ultimater 这不是非常个人化的。无论如何,OO 形式更短,更重要的是,绝对不可能与
mysql_query混淆。旧样式实际上继承自mysql_query,它直接从 1990 年代丑陋的低级 C 库复制而来。