0

I am trying to add a new product to my database via this form:

<form id="add_product" method="post" action="{{ path('company_addp') }}">
        <span class="fa fa-times close" onclick="new_prod()"></span><br />
        <span>Add new product:</span>
        <div id="holder">

        </div>
        <label for="img" style="display:inline-block; color: #5eb5e0; cursor: pointer;">click here</label> to add a picture
        <input type="file" name="upload" id="img" style="display: none;" />
        <input type="text" placeholder="product name" name="name">
        <textarea placeholder="product description" name="desc"></textarea>
        <input type="text" placeholder="price" name="price"/>
        <input type="text" placeholder="quantity" name="qty" />
        <input type="text" placeholder="category" name="type" />
        <input type="submit" value="add product" />
    </form>

via this controller:

    public function addproductAction(Request $request){
        if($request->getMethod() == "POST"){
            $session = $request->getSession();
            $id = $session->get('id');
            $type = $session->get('type');
            if($type == "comp"){

                $em = $this->getDoctrine()->getManager();
                $prod = new Products();
                $prod->setName($request->get('name'));
                $prod->setCompany($id);
                $prod->setDsc($request->get('desc'));
                $prod->setPrice($request->get('price'));
                $prod->setStock($request->get('qty'));
                $prod->setType($request->get('type'));
                $file = $request->files->get('upload');

                if(!is_null($file)){
                    // generate a random name for the file but keep the extension
                    $filename = uniqid().".".$file->getClientOriginalExtension();
                    $path = "assets/product";
                    $file->move($path,$filename); // move the file to a path
                    $prod->setPic($filename);
                    $em->flush();
                }

                $em->persist($prod);
                $em->flush();
                return $this->redirectToRoute('company_homepage');
            }
        }
        else{
            return new Response('you are trying to access wrong route!');
        }
    }
}

but somehow null is being returned in place of the name of the pic, as of this is the msg I am getting when I submit the form:

An exception occurred while executing 'INSERT INTO products (name, dsc, pic, company, type, price, sold, stock) VALUES (?, ?, ?, ?, ?, ?, ?, ?)' with params ["johnsonn's baby shampoo", "it is a baby shampoo and does not hurt the eyes, also good for hair", null, 2, "baby products", "150", null, "990"]:

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'pic' cannot be null

I dont know what the problem is as I am not getting this error for other place where I am updateing the pic with the same code

2
  • The error states that you insert into the table, a null value for pic field. One quick fix would be to edit your Entity class, with this annontation: nullable=true, then $ php app/console doctrine:schema:update --force to syncronize your entity with the table. Here's an example: symfony.com/blog/symfony2-annotations-gets-better. Or assure that through your form, you get a non-null value. Commented May 8, 2016 at 13:56
  • I have created relationship in my database and i dont wanna ruin it by schema update command, any other workarounds? Commented May 8, 2016 at 14:04

1 Answer 1

1

I would implement the logic of the file-upload in your entity because of redundancy problems with the code. Controllers should be tiny and don't have logic to handle file-uploads.

<?php
// src/AppBundle/Bundle/Entity/Image.php

const SERVER_PATH_TO_IMAGE_FOLDER = '/server/path/to/images';

/**
 * Unmapped property to handle file uploads
 */
private $file;

/**
 * Sets file.
 *
 * @param UploadedFile $file
 */
public function setFile(UploadedFile $file = null)
{
    $this->file = $file;
}

/**
 * Get file.
 *
 * @return UploadedFile
 */
public function getFile()
{
    return $this->file;
}

/**
 * Manages the copying of the file to the relevant place on the server
 */
public function upload()
{
    // the file property can be empty if the field is not required
    if (null === $this->getFile()) {
        return;
    }

    // we use the original file name here but you should
    // sanitize it at least to avoid any security issues

    // move takes the target directory and target filename as params
    $this->getFile()->move(
        self::SERVER_PATH_TO_IMAGE_FOLDER,
        $this->getFile()->getClientOriginalName()
    );

    // set the path property to the filename where you've saved the file
    $this->filename = $this->getFile()->getClientOriginalName();

    // clean up the file property as you won't need it anymore
    $this->setFile(null);
}

/**
 * Lifecycle callback to upload the file to the server
 */
public function lifecycleFileUpload()
{
    $this->upload();
}

/**
 * Updates the hash value to force the preUpdate and postUpdate events to fire
 */
public function refreshUpdated()
{
    $this->setUpdated(new \DateTime());
}

// ... the rest of your class lives under here, including the generated fields
//     such as filename and updated

https://sonata-project.org/bundles/admin/master/doc/cookbook/recipe_file_uploads.html

However.

Set this attribute to your form tag:

enctype="multipart/form-data"

cause this mistake I would suggest you using FormTypes of the Symfony Form Component

http://symfony.com/doc/current/book/forms.html

Why do you flush the entity manager at this line

$prod->setPic($filename);
$em->flush(); // <-

Do you check the return statement of the move method on uploaded File?

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.