Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有验证过程的php oop文件上载表单_Php_File Upload_Mysqli - Fatal编程技术网

带有验证过程的php oop文件上载表单

带有验证过程的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

大家好,我是OOP实践新手,我正在尝试使用函数将文件上传到使用PHP的平台上。我需要我的文件上传系统做的是:

文件上传规范

  • 特定的文件扩展名-例如jpg、jpeg、gif、png等
  • 上载到特定目录,但在上载后,根据SQL数据库中条目的id创建一个新目录,即house id 234将创建上载目录234
  • 保留已上载文件的扩展名-例如,如果已上载jpeg,则保留该扩展名
  • 将文件重命名为随机文件名
  • 我已经创建了一个函数,但是我一直被抛出以下错误

    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))