【问题标题】:underscore in php db variable causing problemsphp db变量中的下划线导致问题
【发布时间】:2023-03-20 08:31:01
【问题描述】:

我将数据库的所有登录信息存储在公共树之外的文件中的变量中,例如

$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');

我希望这里有人能让我觉得自己很愚蠢...在此先感谢。 -大卫

这个错误可能会有所帮助...

获取数据库句柄失败:SQLSTATE[28000] [1045] 用户 'myname'@'localhost' 的访问被拒绝(使用密码:否)

【问题讨论】:

  • new PDO 语句之前尝试var_dump($username);
  • 这很有趣。我得到 NULL NULL。
  • $hostname = '172.0.0.0'; $dbname = 'myname_mydbname'; $用户名 = '我的用户名'; $pw = '密码';
  • 都存储在同一个地方...抱歉把它放在三个不同的 cmets 中

标签: php mysql pdo mysql-error-1045


【解决方案1】:

我在 PDO 文档中找不到的任何内容都表明您可以在 DSN 字符串中指定用户名或密码 - 它是“数据库源名称”而不是“数据库源名称和身份验证”字符串,事实上您没有使用密码应该是对此的提示,用户名是“myname”可能只是因为大多数 RDBM 使用 $USER 环境变量来连接,如果没有指定(我必须假设设置为“myname”)

即我认为您只需要使用额外的参数来传递身份验证凭据

【讨论】:

  • 刚刚检查过 - 对于 一些 后端(例如 postgreSQL),您可以在 DSN 中指定身份验证,但不能在 mysql 中指定。
  • 好吧,看起来变量实际上只是在使用它们的文件中显示为 null。你是对的,因为它假设 $USER 是正确的。我将不得不解决为什么变量为空的问题,我可以从它们存储的文件中回显一条语句,所以我知道它被包含在内。
  • 哎呀,我误读了你的问题 :( 是在函数内部调用它吗,你有全局 $username 吗?这是我多次陷入的陷阱
【解决方案2】:

作为一种解决方法,我在文件中构建了 get 函数,该函数存储了返回字符串的信息,并且它可以工作。超级奇怪,但它有效。

【讨论】:

  • $this -> DB = new PDO ("mysql:host=".getHost().";dbname=".getDBName(), getUserName(), getPW());
【解决方案3】:

你应该通过附加引号得到相同的结果

 ////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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-12
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 2023-03-10
    • 1970-01-01
    • 2011-07-10
    相关资源
    最近更新 更多