Artisan Développeur

Qualité, amélioration continue, agilité.

Symfony error: 500 Internal Server Error – SyntaxErrorException

This article is at first a reminder for me, and if it can helps someone it’s even better 😉

When you work with a ORM (Doctrine for me, with Symfony) you have to think data as entities, objects instead of  database tables.

You are moving away from database (mariaDB in my case) and his constraints, it is a good thing for severals points, but there is one you can forget about and time to time you fall into his trap, and you get a really pretty error message.

An exception occurred while executing ‘INSERT INTO my_table (createdAt, updatedAt, name, commercialName, VAT,  oneField, anotherField, foo, bar, again, andAgain, default) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)’ with params [« 2018-02-23 13:55:24 », « 2018-02-23 13:55:24 », « my company », « really nice company », « 20 », null, « 1 », « 0 », null, null, null, null, 0]:

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ‘default) VALUES (‘2018-02-23′ at line 1’
500 Internal Server Error – SyntaxErrorException
2 linked Exceptions:

PDOException

No more suspense here, the trap is quite simple and very basic, it’s the reserved keywords.

Reserved Keywords needs to be managed correctly if you want to use them, below see a real life example:

I need to know if a company is the default one for my user, I add a property name « default » (I use annotations for the doctrine mapping) and bam, SQL is broken.

[pastacode lang= »php » manual= »%20%20%20%20%2F**%0A%20%20%20%20%20*%20%40ORM%5CColumn(type%3D%22boolean%22%2C%20nullable%3Dfalse)%0A%20%20%20%20%20*%2F%0A%20%20%20%20private%20%24default%20%3D%20false%3B » message= »doctrine field  » highlight= » » provider= »manual »/]

The above  error message is pretty clear when you think about the keywords, because Doctrine use the property name to create the database field, the new field is:

[pastacode lang= »sql » manual= »%60default%60%20tinyint(1)%20NOT%20NULL » message= » » highlight= » » provider= »manual »/]

And when you want to insert a company:

[pastacode lang= »sql » manual= »INSERT%20INTO%20my_table%20(createdAt%2C%20updatedAt%2C%20%5B…%5D%2C%20default%20)%20″ message= » » highlight= » » provider= »manual »/]

« default » is not quoted, and mariaDb rise an error.

Fortunately we have several solutions, and my personal (subjective) choice:

Rename your property to something not reserved like « defaultCompany »

[pastacode lang= »php » manual= »%24company-%3EisDefaultCompany()%3B » message= » » highlight= » » provider= »manual »/]

I don’t like that, because the entity is a Company, if you name your variable $company to store it, it is not nice to read.

Quote the field name (in the annotations – doc here)

[pastacode lang= »php » manual= »%20%20%20%20%2F**%0A%20%20%20%20%20*%20%40ORM%5CColumn(name%3D%22%60default%60%22%2C%20type%3D%22boolean%22%2C%20nullable%3Dfalse)%0A%20%20%20%20%20*%2F%0A%20%20%20%20private%20%24default%20%3D%20false%3B » message= » » highlight= » » provider= »manual »/]

I don’t like this one either, it is better than the first but it can lead to complications (see the linked documentation)

Force a field name with the annotations

[pastacode lang= »php » manual= »%20%20%20%20%2F**%0A%20%20%20%20%20*%20%40ORM%5CColumn(name%3D%22defaultCompany%22%2C%20type%3D%22boolean%22%2C%20nullable%3Dfalse)%0A%20%20%20%20%20*%2F%0A%20%20%20%20private%20%24default%20%3D%20false%3B » message= » » highlight= » » provider= »manual »/]

Since we need to add the name of the database field if we want to quote it, I prefer have a non reserved keyword, unquoted, and never be worried by some obscure bug or malfunction because I want so bad to use this field name.

With Doctrine you are almost never in the database, it is not a big deal to have a « defaultCompany » field in the « company » table.

It is bother me when I read my code, but I don’t spend time in the SQL, I prefer have this little ugliness in my DB than in my code.

 

Jenkins log is huge, dns log errors …

If like me you have the bad surprise to have a full partition on your disk, with the consequences we can imagine, you perhaps found that Jenkins have a log file outrageously big…

Full of:

[pastacode lang= »bash » manual= »%5BDNSQuestion%40809381925%20type%3A%20TYPE_IGNORE%20index%200%2C%20class%3A%20CLASS_UNKNOWN%20index%200%2C%20name%3A%20%5D » message= » » highlight= » » provider= »manual »/]

After a quick research it is really Jenkins fault because of an annoying bug :

Jenkins dns error log bug

As you can see it’s an old bug:

Created:
Updated:

And since it’s minor no one seams to work on it…

Workaround here, thanks as always to the stackoverflow community 😉

https://stackoverflow.com/questions/31719756/how-to-stop-jenkins-log-from-becoming-huge

[pastacode lang= »markup » manual= »You%20can%20disable%20the%20logging%20of%20these%20DNS%20errors%20by%20adjusting%20the%20logging%20settings%20within%20Jenkins.%0A%0AFrom%20the%20Jenkins%20web%20interface%20go%20to%3A%0A%0A%20Manage%20Jenkins%20-%3E%20System%20Log%20-%3E%20Log%20Levels%20(on%20the%20left)%0AAdd%20the%20following%20entry%3A%0A%0AName%3A%20javax.jmdns%0A%0ALevel%3A%20off%0AThis%20way%20you%20can%20keep%20the%20Multicast%20DNS%20feature%20but%20without%20all%20the%20logging%20data. » message= » » highlight= » » provider= »manual »/]

And to claim your space on your disk 😉

Before:

[pastacode lang= »bash » manual= »udev%20%20%20%20%20%20%20%20%20%20%20%20%20%20%203%2C9G%20%20%20%20%20%20%200%20%203%2C9G%20%20%200%25%20%2Fdev%0Atmpfs%20%20%20%20%20%20%20%20%20%20%20%20%20%20803M%20%20%20%20%2079M%20%20724M%20%2010%25%20%2Frun%0A%2Fdev%2Fxvda2%20%20%20%20%20%20%20%20%20%2054G%20%20%20%20%2054G%20%20%20%20%200%20100%25%20%2F%0Atmpfs%20%20%20%20%20%20%20%20%20%20%20%20%20%204%2C0G%20%20%20%20%20%20%200%20%204%2C0G%20%20%200%25%20%2Fdev%2Fshm%0Atmpfs%20%20%20%20%20%20%20%20%20%20%20%20%20%205%2C0M%20%20%20%20%20%20%200%20%205%2C0M%20%20%200%25%20%2Frun%2Flock%0Atmpfs%20%20%20%20%20%20%20%20%20%20%20%20%20%204%2C0G%20%20%20%20%20%20%200%20%204%2C0G%20%20%200%25%20%2Fsys%2Ffs%2Fcgroup%0A » message= » » highlight= » » provider= »manual »/]

[pastacode lang= »bash » manual= »service%20jenkins%20stop%0Arm%20%2Fvar%2Flog%2Fjenkins%2Fjenkins.log%0Adf%20-h%20%23to%20check%20your%20space%20left » message= » » highlight= » » provider= »manual »/]

After:

[pastacode lang= »bash » manual= »udev%20%20%20%20%20%20%20%20%20%20%20%20%20%20%203%2C9G%20%20%20%20%20%20%200%20%203%2C9G%20%20%200%25%20%2Fdev%0Atmpfs%20%20%20%20%20%20%20%20%20%20%20%20%20%20803M%20%20%20%20%2079M%20%20724M%20%2010%25%20%2Frun%0A%2Fdev%2Fxvda2%20%20%20%20%20%20%20%20%20%2054G%20%20%20%20%2013G%20%20%2039G%20%2025%25%20%2F%0Atmpfs%20%20%20%20%20%20%20%20%20%20%20%20%20%204%2C0G%20%20%20%20%20%20%200%20%204%2C0G%20%20%200%25%20%2Fdev%2Fshm%0Atmpfs%20%20%20%20%20%20%20%20%20%20%20%20%20%205%2C0M%20%20%20%20%20%20%200%20%205%2C0M%20%20%200%25%20%2Frun%2Flock%0Atmpfs%20%20%20%20%20%20%20%20%20%20%20%20%20%204%2C0G%20%20%20%20%20%20%200%20%204%2C0G%20%20%200%25%20%2Fsys%2Ffs%2Fcgroup%0A » message= » » highlight= » » provider= »manual »/]

Feels good !

 

Using mylvmbackup, debian 9 with mariadb

If you run mylvmbackup with mariadb on debian9 with the defaults values, you will have this:

[pastacode lang= »bash » manual= »mycnf%3D%2Fetc%2Fmysql%2Fmy.cnf » message= » » highlight= » » provider= »manual »/]

But it is a symlink pointing to :

[pastacode lang= »bash » manual= »%2Fetc%2Falternatives%2Fmy.cnf » message= » » highlight= » » provider= »manual »/]

And mylvmbackup can’t work with that:

[pastacode lang= »bash » manual= »Could%20not%20copy%20%2Fetc%2Fmysql%2Fmy.cnf%20to%20%2Fvar%2Fcache%2Fmylvmbackup%2Fmnt%2Fbackup-cnf-20171025_151739_mysql%3A%20File%20exists » message= » » highlight= » » provider= »manual »/]

Here is a bug report mylvmbackup symlink my.cnf

 

You just need to setup the mycnf as follow, in the /etc/mylvmbackup.conf or directly in the command line (with –mycnf= ):

[pastacode lang= »bash » manual= »mycnf%3D%2Fetc%2Fmysql%2Fmariadb.cnf » message= » » highlight= » » provider= »manual »/]

Done ! Now mylvmbackup stop complaining 🙂