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

Nim*_*ima 2 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();
Run Code Online (Sandbox Code Playgroud)

它给出了这个错误:

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

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

Fun*_*ner 10

这与UTF-8无关.

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

$password = "!@#$test";用双引号括起来在技术上寻找一个叫做变量$test,并试图解析它.

它需要用单引号:

$password = '!@#$test';
Run Code Online (Sandbox Code Playgroud)

注:!@也有PHP特殊的意义.

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

从理论上讲,错误报告应该会让你注意到一个未定义的变量.

UTF-8处理查询时无法正确显示的查询和字符,具体取决于db/table的排序规则.

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

这包含在以下问答中:

  • 真的只是个人偏好,我讨厌混合```和```所以对我来说,要么改变所有东西要么''`或者只是逃避`$` (2认同)