带有验证过程的php oop文件上载表单
大家好,我是OOP实践新手,我正在尝试使用函数将文件上传到使用PHP的平台上。我需要我的文件上传系统做的是: 文件上传规范带有验证过程的php oop文件上载表单,php,file-upload,mysqli,Php,File Upload,Mysqli,大家好,我是OOP实践新手,我正在尝试使用函数将文件上传到使用PHP的平台上。我需要我的文件上传系统做的是: 文件上传规范 特定的文件扩展名-例如jpg、jpeg、gif、png等 上载到特定目录,但在上载后,根据SQL数据库中条目的id创建一个新目录,即house id 234将创建上载目录234 保留已上载文件的扩展名-例如,如果已上载jpeg,则保留该扩展名 将文件重命名为随机文件名 我已经创建了一个函数,但是我一直被抛出以下错误 Warning: mkdir() [function.mk
Warning: mkdir() [function.mkdir]: File exists in /Applications/XAMPP/xamppfiles/htdocs/undergradpad/classes/class.House.inc on line 52
我不明白这意味着什么,因为该目录中不存在该文件,但添加房屋详细信息的声明已输入数据库
任何帮助都会受到热烈欢迎
我的代码如下:
classes/class.House.inc
<?php
include("connect/class.Database.inc");
class House extends Database {
public function insert ($field) {
$sql = "INSERT INTO houses(bedrooms, description, roadname, postcode, price, deposit, contractlength, available, bathrooms, livingrooms, outdoorspace, furnishing, contactdetails)
VALUES('".$this->bedrooms."', '".$this->description."', '".$this->roadname."', '".$this->postcode."', '".$this->price."', '".$this->deposit."', '".$this->contractlength."', '".$this->available."', '".$this->bathrooms."', '".$this->livingrooms."', '".$this->outdoorspace."', '".$this->furnishing."', '".$this->contactdetails."')";
$result = $this->mysqli->query($sql) or die("insert:".$mysqli->error());
$allowedExtensions = array("jpg","jpeg","gif","png");
$path = "../files/uploads/houses_gallery/$mysqli->insert_id";
if (!$this->mysqli->query($sql) && is_dir($path))
{
die('Error: ' . $mysqli->error());
}
echo "<h3>1 record added</h3>";
mkdir($path);
move_uploaded_file($_FILES['fileField']['tmp_name'], "$path");
}
}
?>
应该是
$path = "../files/uploads/houses_gallery/" . $this->mysqli->insert_id;
正如Mark B所指出的,当心sql注入。您应该准备好您的查询:您也在不一致地使用mysqli。我不确定它应该是$mysqli
还是$this->mysqli
,但我肯定会猜测后者
这种情况是否符合您的意愿?检查查询是否失败,目录是否已存在
if (!$this->mysqli->query($sql) && is_dir($path))
{
die('Error: ' . $mysqli->error());
}
这段摘录也是您第二次为同一插入调用mysqli->query
。我认为您应该在这里使用$result
,而不是尝试插入两次
实际上,我不认为您需要检查查询是否在这一点上失败,因为您已经检查了它是否在以下情况下失败:
$result = $this->mysqli->query($sql) or die("insert:".$mysqli->error());
这有效地防止了该条件评估为真,如果写为:
if (!$result && is_dir($path))
美好的享受您的服务器pwn3d。作为一般建议,请尝试安装调试器(如或Zend debugger),以便您可以看到代码的逐步执行。一种更原始的方法是var\u dump
将$path
内容放在mkdir
之前。另外,是否有理由使用“$path”
而不是$path
?您能显示$\u文件['fileField']['tmp\u name']
的内容吗?我发现这使它更加简化了,但是我仍然得到与以前相同的错误好的,House表是否有一个自动增量列作为插入id返回?如果没有自动增量属性,则返回的插入id将为0,如上所述。此外,运行此操作时是否成功插入了任何行?它是否创建了任何目录或文件?而且,正如Andrés已经指出的,在失败之前对$path进行var_转储可能会有所帮助,特别是如果它是“../files/uploads/houses_gallery/0”,如果我之前的评论是正确的,那么应该这样做,例如,是的,列是自动递增的,表单内容被输入到sql表中,但文件夹尚未创建,var转储仅输出bool(false)
是否为mkdir($path)
的var\u转储?那没用。我们知道这是失败的。我们需要$path的var_转储。只需添加一行var\u dump($path)代码>就在mkdir语句之前。我对PHP的了解不是无限的,但我无法想象为什么$path会是bool(false)。
$result = $this->mysqli->query($sql) or die("insert:".$mysqli->error());
if (!$result && is_dir($path))