我将数据库的所有登录信息存储在公共树之外的文件中,例如
$hostname = '172.0.0.0';
$dbname = 'myname_mydbname';
$username = 'myname_user';
$pw = 'password';
这是非常标准的。
问题是我正在使用的这个特定主机需要将myname_
附加到所有数据库和用户名的前面。当我存储这些字符串并将它们传递给PDO时,它会删除myname后的用户名中的所有内容,并将密码字符串全部放在一起...如果我将用户名和密码作为字符串而不是变量放在函数中,一切正常。我没办法。有人可以帮忙吗?这是代码中的函数。
不起作用:
$this -> DB = new PDO ("mysql:host={$hostname}; dbname={$dbname}", $username, $pw);
工作的:
$this -> DB = new PDO ("mysql:host={$hostname};dbname={$dbname}", 'myname_user', 'password');
我希望有人能让我感到愚蠢...提前谢谢。 -David
错误可能会有所帮助......
无法获得数据库句柄:SQLSTATE [28000] [1045]用户“myname”@“localhost”访问被拒绝(使用密码:否)
答案 0 :(得分:0)
我在PDO文档中找不到的任何内容表明您可以在DSN字符串中指定用户名或密码 - 它是“数据库源名称”而不是“数据库源名称和身份验证”字符串您使用无密码的事实应该是一个提示,用户名为'myname'可能只是因为大多数RDBM使用$ USER环境var连接,如果没有指定(我必须假设设置为'myname')
即。我认为您只需使用额外的参数来传递身份验证凭据
答案 1 :(得分:0)
作为一种解决方法,我在文件中构建了get函数,该函数存储了返回字符串的信息,并且它可以工作。超级奇怪,但它确实有效。
答案 2 :(得分:0)
你应该通过附加引号获得相同的结果
////the variable
$myusr='myname_user';
////now append quotes
$user="'".$myusr."'";
///which would be the same thing as
$psswd= "'pass_word'";
pdo函数将删除单引号('')如果你想在sql语句中用引号存储它'''password \'',因为存储的引号必须与分隔符一起存储以防止自动转义
INSERT INTO `Auth_USERs` (`id`, `usrname`, `passwd`, `email`, `reg_date`) VALUES (NULL, '\'myname_user\'', '\'pass_word\'', 'someone@somewhere.com', CURRENT_TIMESTAMP);
你遇到了{},因为它将变量视为容器内部,因此它附加''当然get数组也会这样做(使用不同的字符,然后php会在下一页加载时将它们转义),因为你是执行一个java函数来生成你的get函数,你实际上是附加了没有转义的引号。直到PDO函数逃脱它们。
$this -> DB = new PDO ("mysql:host={$hostname};dbname={$dbname}", $user, $psswd);