PDO连接密码不能有$#!人物

时间:2017-07-20 20:31:43

标签: php mysql pdo

我用!我的MySQL用户密码中的@#$

但在我的密码中使用这些字符时,PDO无法连接到MySQL服务器

$servername = "localhost";
$username = "test";
$password = "!@#$test";
$dbname = "test";

try {
  $test = $_POST['test'];
  $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, 
  $password, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
  // set the PDO error mode to exception
  $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  // prepare sql and bind parameters
  $stmt = $conn->prepare("INSERT INTO test (test) 
  VALUES (:test)");
  $stmt->bindParam(':test', $test);


  $stmt->execute();

它给出了这个错误:

  

SQLSTATE [HY000] [1045]访问被拒绝用户'test'@'localhost'(使用密码:是)

从密码中删除!@#$时,它可以正常工作

1 个答案:

答案 0 :(得分:9)

这与UTF-8无关。

PHP认为您有一个变量名称,并为其分配了$

带有双引号的$password = "!@#$test";在技术上正在寻找一个名为$test的变量,并且正在尝试解析它。

它必须是单引号:

$password = '!@#$test';

注意:!@在PHP中也有特殊含义。

  • !not
  • @是错误抑制器和电子邮件中使用的字符。
  • #是评论字符。

理论上,错误报告向您发出有关未定义变量的通知。

UTF-8处理在查询时无法正确显示的查询和字符,具体取决于数据库/表格的排序规则。

如果您在查询的输出中开始看到?,那么您需要将连接的DSN设置为UTF-8。

以下Q& A:

中对此进行了介绍