I have this PHP:

exec("/csvexport.sh $table");

Which runs this bash script (it exports a table to CSV):


mysql --database=db --user=user --password=pass -B -e "SELECT field1, field2, IF(field3 = '0000-00-00','0001-01-01',field3) AS field3 FROM mytable;" | sed "s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g" > /home/backups/$table.csv

This works fine. However I want the query to be dynamic like so:

$query = "SELECT field1, field2, IF(field3 = '0000-00-00','0001-01-01',field3) AS field3 FROM mytable;";
exec("/csvexport.sh $query $table");

If I change my bash like so:


mysql --database=db --user=user --password=pass -B -e "$query" | sed "s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g" > /home/backups/$table.csv

Even though everything is "identical" it gives the following error:

sh: -c: line 0: syntax error near unexpected token `('

So I'm thinking it isn't happy with how the query contains brackets when passed from PHP?

  • 1
    It may be easier to create a php-cli script. PHP contains all the functions for MySQL, mysqli and can handle cli parameters. – jc__ Jun 18 '18 at 18:03
  • Precisely! Why scratching your left ear with the right hand? Shelling out bears many risks, which can be eliminated by letting PHP do all the work. – ajeh Jun 18 '18 at 18:34

Passing parameters to a shell script from PHP.

Its all about the "strings", and when to "double quote" for expansion.


/* exec("/csvexport.sh $table"); */

/* double quote here because you want PHP to expand $table */
/* Escape double quotes so they are passed to the shell because you do not wnat the shell to choke on spaces */
$command_with_parameters = "/path/csvexport.sh \"${table}\"";
$output_from_command = "";
$command_success = "";

/* double quote here because you want PHP to expand $command_with_parameters, a string */
exec("${command_with_parameters}", $output_from_command, $command_success);

/* or to keep it simple */
exec("/path/csvexport.sh \"${table}\"");

/* show me what you got */


BTW: I did not test this snippet.


I'm not a PHP guy, but it seems you'll need to do something like

exec(escapeshellcmd("/csvexport.sh \"$query\" $table"));

Does PHP have a function where you can call the command and pass the arguments separately?

some_exec_function("/csvexport.sh", $query, $table);  # ???

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.