图像文件未插入数据库

时间:2015-06-15 01:31:00

标签: php html mysqli prepared-statement image-uploading

我试图将图像文件发送到我的主机服务器中名为productpics /的文件,然后将文件的名称发送到我的数据库中,其中包含我表单中的所有其他数据。我将图像文件发送到productpics文件夹,但随后我准备好的语句中断,没有其他任何事情发生。没有任何内容发送到数据库。我相信这是因为我尝试将图像文件发送到数据库。

我认为打破这条线的是....

我在提交表单时遇到此错误,但无论我不确定我是否正在尝试将其正确发送到数据库。我是按照正确的方式做到这一点还是基于我拥有的,我该如何构建它?

致命错误:函数名称必须是第110行/home4/pfarley1/public_html/addproduct.php中的字符串

//Create
    $filename = $_FILES['file']['name'];
    //$filesize = $_FILES['file']['size'];
    //$filetype = $_FILES['file']['type'];
    $tmp_name = $_FILES['file']['tmp_name'];
    $file_error = $_FILES['file']['error'];



    if (isset($filename )) {
        if (!empty($filename)) {

            $destinationFolder = 'productpics/';

            if (move_uploaded_file($tmp_name, $destinationFolder.$filename)) {
                echo 'Uploaded!';
            } else {
                echo 'There was an error!';
            }

        } else {
            echo 'Please choose a file.';
        }
    }
    if($validation->passed()) {
        if(isset($_POST['create'])){ 
            $product_id = trim( $_POST['product_id'] );
            $product_name = trim( $_POST['product_name'] );
            $price = trim( $_POST['price'] );
            $saleprice = trim( $_POST['saleprice'] );
            $final_price = trim( $_POST['final_price'] );
            $shippingprice = trim( $_POST['shippingprice'] );
            $category = trim( $_POST['category'] );
            $item_details = trim( $_POST['item_details'] );
            $item_details2 = trim( $_POST['item_details2'] );
            $description = trim( $_POST['description'] );
            $viewproduct_type = trim( $_POST['viewproduct_type'] );
            $file = $_POST ($filename['img']);

           }else {
            foreach($validation->errors() as $error) {
                echo $error, '<br>';
            }
          //Connection
        $con = mysqli_connect("localhost","root","","bfb");
        /* check connection */
            if (mysqli_connect_errno()) {
                printf("Connect failed: %s\n", mysqli_connect_error());
                exit();
            }



            /* create a prepared statement */
            if ($stmt = mysqli_prepare($con, "INSERT INTO products (product_id, product_name, price, saleprice, final_price, shippingprice, category, item_details, item_details2, description, viewproduct_type, date_created, img) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NOW(), ?)")) {


                /* bind parameters for markers */
                $stmt->bind_param('isiiiissssss', $product_id, $product_name, $price, $saleprice, $final_price, $shippingprice, $category, $item_details, $item_details2, $description, $viewproduct_type, $file);

                /* execute query */
                $stmt->execute();
                //if(!$stmt->execute()){trigger_error("there was an error....".$con->error, E_USER_WARNING);}


            /* close statement */
            mysqli_stmt_close($stmt);
                echo "Success!";
            } else {
                echo "Failed!";
            }
            }

所有这些都说明了,我没有得到任何与我准备好的陈述查询的其他陈述相呼应的东西。我没有取得成功!&#39;或者&#39;失败!&#39;。为什么没有显示任何结果?

我的表格(img文件部分位于其底部......

<form action="" method="POST" enctype="multipart/form-data">
 <div class="field">
    <label for="product_id">Product ID</label>
    <input type="text" name="product_id" class="smallinputbar" required>
</div>
<div class="field">
    <label for="product_name">Product Name</label>
    <input type="text" class="inputbar" name="product_name" required>
</div>
<div class="field">
    <label for="price">Product Price</label>
    <input type="text" class="smallinputbar" name="price" required>
</div>
<div class="field">
    <label for="saleprice">Sale Price</label>
    <input type="text" class="smallinputbar" name="saleprice">
</div>
<div class="field">
    <label for="final_price">Final Price</label>
    <input type="text" class="smallinputbar" name="final_price" required>
</div>
<div class="field">
    <label for="shippingprice">Shipping Price</label>
    <input type="text" class="smallinputbar" name="shippingprice" required>
</div>
<div class="field">
    <label for="category">Category</label>
    <input type="text" class="inputbar" name="category" required>
</div>
<div class="field">
    <label for="item_details">Item Details</label>
    <input type="message" class="messageinput" name="item_details" required>
</div>
<div class="field">
    <label for="item_details2">Item Details 2</label>
    <input type="message" class="messageinput" name="item_details2">
</div>
<div class="field">
    <label for="description">Description</label>
    <input type="message" class="messageinput" name="description" required>
</div>
<div class="field">
    <label for="viewproduct_type">View Product Type</label>
    <select class="optionbar" name="viewproduct_type">
        <option value="Not Selected">Not Selected</option>
        <option value="a href='./viewProduct.php?view_product=$id">Standard</option>
        <option value="Option">Option</option>
    </select>
</div>

<span class="floatright">
    <input type="file" name="file" class="inputbarfile">
    <!--<input type="submit" name="create" id="signinButton" value="Upload">-->
</span>
<input type="hidden" name="token" value="<?php echo Token::generate(); ?>">
    <label for="button">
    <input type="submit" id="button" name="create" value="Create New Product">
    </label>
  </form>

更新:

//Create
    $filename = $_FILES['file']['name'];
    //$filesize = $_FILES['file']['size'];
    //$filetype = $_FILES['file']['type'];
    $tmp_name = $_FILES['file']['tmp_name'];
    $file_error = $_FILES['file']['error'];



    if (isset($filename )) {
        if (!empty($filename)) {

            $destinationFolder = 'productpics/';

            if (move_uploaded_file($tmp_name, $destinationFolder.$filename)) {
                echo 'Uploaded!';
            } else {
                echo 'There was an error!';
            }

        } else {
            echo 'Please choose a file.';
        }
    }

    if($validation->passed()) {
        if(isset($_POST['create'])){ 
            $product_id = trim( $_POST['product_id'] );
            $product_name = trim( $_POST['product_name'] );
            $price = trim( $_POST['price'] );
            $saleprice = trim( $_POST['saleprice'] );
            $final_price = trim( $_POST['final_price'] );
            $shippingprice = trim( $_POST['shippingprice'] );
            $category = trim( $_POST['category'] );
            $item_details = trim( $_POST['item_details'] );
            $item_details2 = trim( $_POST['item_details2'] );
            $description = trim( $_POST['description'] );
            $viewproduct_type = trim( $_POST['viewproduct_type'] );
            $file = $filename;

此问题的完整PHP代码。

//Validation
if(Input::exists()) {
    if(Token::check(Input::get('token'))) {

        $validate = new Validate();
        $validation = $validate->check($_POST, array(
            'product_id' => array(
                'required' => true,
                'min' => 1,
                'max' => 50,
                'unique' => 'products'
            ),
            'product_name' => array (
                'required' => true,
                'min' => 2,
                'max' => 50
            ),
            'price' => array (
                'required' => true,
                'min' => 1,
                'max' => 50
            ),
            'saleprice' => array (
                'min' => 1,
                'max' => 50
            ),
            'final_price' => array (
                'required' => true,
                'min' => 1,
                'max' => 50
            ),
            'shippingprice' => array (
                'max' => 50
            ),
            'category' => array (
                'required' => true,
                'min' => 2,
                'max' => 50
            ),
            'item_details' => array (
                'required' => true,
                'min' => 2,
                'max' => 1550
            ),
            'item_details2' => array (
                'max' => 1550
            ),
            'description' => array (
                'required' => true,
                'min' => 2,
                'max' => 1550
            )

        )
        );
//Create

        if($validation->passed()) {

        $filename = $_FILES['file']['name'];
        //$filesize = $_FILES['file']['size'];
        //$filetype = $_FILES['file']['type'];
        $tmp_name = $_FILES['file']['tmp_name'];
        $file_error = $_FILES['file']['error'];



        if (isset($filename )) {
            if (!empty($filename)) {

                $destinationFolder = 'productpics/';

                if (move_uploaded_file($tmp_name, $destinationFolder.$filename)) {
                    echo 'Uploaded!';
                } else {
                    echo 'There was an error!';
                }

            } else {
                echo 'Please choose a file.';
            }
        }
            if(isset($_POST['create'])){ 
                $product_id = trim( $_POST['product_id'] );
                $product_name = trim( $_POST['product_name'] );
                $price = trim( $_POST['price'] );
                $saleprice = trim( $_POST['saleprice'] );
                $final_price = trim( $_POST['final_price'] );
                $shippingprice = trim( $_POST['shippingprice'] );
                $category = trim( $_POST['category'] );
                $item_details = trim( $_POST['item_details'] );
                $item_details2 = trim( $_POST['item_details2'] );
                $description = trim( $_POST['description'] );
                $viewproduct_type = trim( $_POST['viewproduct_type'] );
                $file = $filename;
                $file = $_POST['img'];

            }else {
                foreach($validation->errors() as $error) {
                    echo $error, '<br>';
                }

            //Connection
            $con = mysqli_connect("localhost","root","","bfb");
            /* check connection */
                if (mysqli_connect_errno()) {
                    printf("Connect failed: %s\n", mysqli_connect_error());
                    exit();
                }



                /* create a prepared statement */
                if ($stmt = mysqli_prepare($con, "INSERT INTO products (product_id, product_name, price, saleprice, final_price, shippingprice, category, item_details, item_details2, description, viewproduct_type, date_created, img) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NOW(), ?)")) {


                    /* bind parameters for markers */
                    $stmt->bind_param('isiiiissssss', $product_id, $product_name, $price, $saleprice, $final_price, $shippingprice, $category, $item_details, $item_details2, $description, $viewproduct_type, $file);

                    /* execute query */
                    $stmt->execute();
                    //if(!$stmt->execute()){trigger_error("there was an error....".$con->error, E_USER_WARNING);}


                /* close statement */
                mysqli_stmt_close($stmt);
                    echo "Success!";
                } else {
                    echo "Failed!";
                }
                }
            }
        }
     }

1 个答案:

答案 0 :(得分:1)

此时来回评论时间过长,并且提交了以下答案,因为评论时间过长。

虽然这可能不是一个解决方案(或者可能是一个解决方案,或者它可能导致一个解决方案),但仍然是您发布的问题/错误消息的答案。

问题在于这一行$file = $_POST ($filename['img']);,我不知道你在这里要做什么。 你之前在评论中告诉我“我对'img'的专栏是文字”

  • POST与列无关。
  • POST数组使用这个语法$_POST[]使用方括号,而不是$_POST()使用圆括号。

这就是您收到以下错误的原因:

  

致命错误:函数名称必须是第110行/home4/pfarley1/public_html/addproduct.php中的字符串

我不知道您是否要将上传的文件作为二进制文件插入列中,或者是基于文本的指向该文件的指针,只有您知道它的确切意图。

如果要将其作为二进制文件输入,则需要将其关联列设置为BLOB。

当使用BLOB作为列类型时,需要转义该数据,否则会引发错误。

您还需要检查系统文件中设置/允许的上传最大大小。

默认情况下,PHP将其设置为2M。如果文件超过该大小,则会失败;增加它和相关的任何其他内容,例如最大超时时间。

你也没有做错误检查:

$file_error = $_FILES['file']['error'];

这是一个迷路/未使用的变量。

请教:

检查错误并使用它。

就我而言,我会摆脱$file = $_POST ($filename['img']);并使用$filename作为你想要输入数据库的变量,因为它进入{{1}您在查询中设置了该列。

  • 检查您的色谱柱长度,看它是否足够长以容纳该条目。
  

“我对'img'的专栏是文字。”

  • 您可能还想将其从img更改为TEXT,并为其设置足够长的时间。由于它,MySQL可能会无声地失败。

我建议您做的另一件事是将VARCHAR和其他变量放在条件语句中。

如果您想使用类似的语法来替换$filename = $_FILES['file']['name'];,那么您可以添加一个额外的输入并为其指定$file = $_POST ($filename['img']); name属性,然后执行以下操作:

img

这将是有效的。

我在你的第一段代码中发现了另一件事,如果这是你的整个代码,你错过了$file = $_POST['img']; 条件语句的右括号}

最后/最后一个大括号if($validation->passed()) {与此代码块相关联:

}
  • 因此,您需要检查支撑匹配/对。

修改

您在编辑中添加的这一行:

else {
            foreach($validation->errors() as $error) {
                echo $error, '<br>';
            }

您正在覆盖您的第一个变量,并且您在评论中声明您没有表单元素名称$file = $filename; $file = $_POST['img'];

但那是一个文件而不是文字。使用img$file = $_FILES['img']; - 此时,我不知道您在表单中输入的文件是什么。

  • 如果它仍然给您带来麻烦,请使用$file = $_FILES['file'];

MySQL和PHP是两种不同的动物,不知道哪个列用于插入。

您不能依赖POST数组来确定要插入的列。您需要在查询中指定它。

确保$file = $_FILES['file']['name'];列确实存在,然后使用img数组及其相关变量作为$_FILES中的值VALUES

  • 但是,请在您的VALUES中使用$file,而不是$filename。或者,无论变量如何;到目前为止,我对你正在使用的变量和/或输入名称感到困惑。

您可能需要在$file函数/数组中添加该参数。

error reporting添加到文件的顶部,这有助于查找错误。

$validation = $validate->check($_POST, array(...

旁注:错误报告应仅在暂存时完成,而不是生产。