Reputation: 553
$db = new PDO('mysql:dbname=xnews;host=localhost;port=' . $LOCAL_DB_PORT,
$LOCAL_DB_USER,
$LOCAL_DB_PASS,
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'")
);
reports:
Undefined class constant 'MYSQL_ATTR_INIT_COMMAND'
Is it renamed?
Upvotes: 50
Views: 163238
Reputation: 6997
A note from the future: most likely you don't need this parameter at all, just like in the opening post. Instead of setting charset using this awkward option, it should be done in DSN:
$db = new PDO('mysql:dbname=xnews;host=localhost;charset=utf8mb4;port=3306',
$LOCAL_DB_USER,
$LOCAL_DB_PASS,
);
I just had the same error (with PHP 5.2.6), and all I had to do is enable the MySQL-specific PDO driver:
In your php.ini
file, you should have the following line (uncommented):
extension=php_pdo_mysql.dll
on Windowsextension=php_pdo_mysql.so
on Linux/Macopen php.ini
in a text editor
C:\Program Files (x86)\PHP\v5.X\php.ini
(substitute v5.x with the version you installed) or C:\Windows\php.ini
, etc./etc/php5/apache2/php.ini
(e.g. this is the path on Ubuntu) or /etc/php5/cli/php.ini
, /etc/php5/cgi/php.ini
, etc.php --ini | find /i "Loaded"
in Windows command prompt ORphp --ini | grep "Loaded"
in Linux/Mac terminalphpinfo()
, and looking for the line "Loaded Configuration File"and remove the semicolon from the beginning of the following line (to uncomment it):
;extension=php_pdo_mysql.dll
on Windows
;extension=php_pdo_mysql.so
on Linux/Macphp.ini
:
extension=php_pdo_mysql.dll
on Windowsextension=php_pdo_mysql.so
on Linux/MacYou may need to restart your web server.
That solved my problem.
Upvotes: 70
Reputation: 137
If you are on windows using PHP8 just uncomment extension=pdo_mysql in c:\php\php.ini
Upvotes: -1
Reputation: 1034
On fedora with PHP 8.0.16:
sudo dnf install php-mysqlnd.x86_64
Upvotes: 0
Reputation: 12674
While this question is fairly old, I just got here with a similar issue. These days with PHP namespaces, it seems you need \PDO
instead of just PDO
. For example:
$options = array(\PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'");
instead of:
$options = array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'");
Upvotes: 1
Reputation: 81
For anyone coming along later, like I did, and seeing this...
I was receiving the same error because I did not have the extension "enabled" in my php.ini file. I would imagine you might also get this error if you have recently upgraded your php version and did not properly update your php.ini file.
If you are receiving this error shortly after upgrading your php version, the info below might help you out:
PHP 7.4 slightly changed its syntax in the php.ini file.
Now, to enable the mysql pdo, make sure extension=pdo_mysql
is uncommented in your php.ini file. (line 931 in the default php.ini setup)
The line used to be:
extension=php_pdo_mysql.dll on Windows
extension=php_pdo_mysql.so on Linux/Mac
as Sk8erPeter pointed out. but the .dll and .so endings are to be deprecated and so it is best practice to begin getting rid of those endings and using just extension=<ext>
The below is pulled from the default php.ini-production file from the php 7.4 zip download under "Dynamic Extensions":
Note : The syntax used in previous PHP versions ('extension=.so' and 'extension='php_.dll') is supported for legacy reasons and may be deprecated in a future PHP major version. So, when it is possible, please move to the new (
extension=<ext>
) syntax.
Upvotes: 7
Reputation: 1388
I got the same error, on debian6, when I had not yet installed php5-mysql
.
So I installed it, then restarted apache2
apt-get install php5-mysql
/etc/init.d/apache2 restart
Then the error went away.
If you have the same error on Ubuntu, instead of:
/etc/init.d/apache2 restart
Type:
service apache2 restart
Upvotes: 35
Reputation: 5055
For Centos I was missing php-mysql library:
yum install php-mysql
service httpd restart
There is no need to enable any extension in php.ini, it is loaded by default.
Upvotes: 5
Reputation: 9748
For me it was missing MySQL PDO, I recompiled my PHP with the --with-pdo-mysql
option, installed it and restarted apache and it was all working
Upvotes: 2
Reputation: 2348
This is due to a PHP 5.3.0 bug on Windows where MYSQL_ATTR_INIT_COMMAND is not available. The PHP bug report is:
http://bugs.php.net/bug.php?id=47224
If you are experiencing this, please update your WAMP product to a version that uses PHP 5.3.1 or later version.
Upvotes: 0
Reputation: 13682
Using the int value 1002
seems to work for PHP 5.3.0:
public static function createDB() {
$dbHost="localhost";
$dbName="project";
$dbUser="admin";
$dbPassword="whatever";
$dbOptions=array(1002 => 'SET NAMES utf8',);
return new DB($dbHost, $dbName, $dbUser, $dbPassword,$dbOptions);
}
function createConnexion() {
return new PDO(
"mysql:host=$this->dbHost;dbname=$this->dbName",
$this->dbUser,
$this->dbPassword,
$this->dbOptions);
}
Upvotes: 0
Reputation: 2011
I got this error this morning, I just did a fresh install of Fedora 14 and was trying to get my local projects back online. I was missing php-mysql, I installed it via yum and the error is now gone.
Upvotes: 0
Reputation: 1203
You could try replacing it with 1002 or issuing your initialization query right after opening a connection.
Upvotes: 1
Reputation: 401152
I just tried with PHP 5.2, and that constant seems to exists :
var_dump(PDO::MYSQL_ATTR_INIT_COMMAND);
Gives me :
int 1002
But it seems there is a bug in PHP 5.3, that causes this constant to not exists anymore -- or, at least, not when the mysqlnd driver is used (and it's the one that's configured by default)
I suppose a temporary solution, as suggested on this bug report, could be to directly use the integer 1002
value, instead of the contant...
But note that you should go back to using the constant as soon as possible -- as this makes the code easier to understand.
Upvotes: 4
Reputation: 7930
It appears to only be availabe using the mysqlnd driver.
Try replacing it with the integer it represents; 1002, if I am not mistaken.
Upvotes: 5