0

我面临一个让我发疯的问题,我一直在寻找解决方案,但我对 php 的有限知识不足以解决它,所以我们开始吧,希望你能帮助我。

我正在通过 PHP 生成一个查询,该查询如下:

CREATE USER 'wally'@'localhost' IDENTIFIED BY 'wally123'; 
GRANT USAGE ON * . * TO 'wally'@'localhost' IDENTIFIED BY 'wally123' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ; 
GRANT ALL PRIVILEGES ON `wally\_%` . * TO 'wally'@'localhost'; 
CREATE USER 'wally'@'%' IDENTIFIED BY 'wally123'; GRANT USAGE ON * . * TO 'wally'@'%' IDENTIFIED BY 'wally123' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ; 
GRANT ALL PRIVILEGES ON `wally\_%` . * TO 'wally'@'%'; 
CREATE DATABASE wally_foro; 
CREATE DATABASE wally_foro2;

当我在我的 phpmyadmin 上运行它时,它可以完美运行,但是当我将此查询输入 ssh 命令并发送它时:

mysql -uMYUSERHERE -pMYPASSWORDHERE  -e "CREATE USER 'wally'@'localhost' IDENTIFIED BY 'wally123'; GRANT USAGE ON * . * TO 'wally'@'localhost' IDENTIFIED BY 'wally123' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ; GRANT ALL PRIVILEGES ON `wally\_%` . * TO 'wally'@'localhost'; CREATE USER 'wally'@'%' IDENTIFIED BY 'wally123'; GRANT USAGE ON * . * TO 'wally'@'%' IDENTIFIED BY 'wally123' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ; GRANT ALL PRIVILEGES ON `wally\_%` . * TO 'wally'@'%'; CREATE DATABASE wally_foro; CREATE DATABASE wally_foro2;"

它只是给了我一个错误:

第 1 行的 ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“TO 'wally'@'localhost'' 附近使用正确的语法*

我需要它是一个 ssh 连接,但我不知道如何使它工作。如果假设我不能直接在命令行上使用脚本,为什么它会通过 line 命令而不是在 phpmyadmin 中退出错误。我错了吗 ?

谢谢你,真的很感谢你的支持!


感谢您的支持。到目前为止,我得到了这个:

mysql -uMYUSER -pMYPASS  -e "CREATE DATABASE wally_foro; CREATE DATABASE wally_foro2; CREATE USER 'wally'@'localhost' IDENTIFIED BY 'wally123'; GRANT USAGE ON * . * TO 'wally'@'localhost' IDENTIFIED BY 'wally123' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ; GRANT ALL PRIVILEGES ON ``wally\\\_\%`` . * TO 'wally'@'localhost'; CREATE USER 'wally'@'\%' IDENTIFIED BY 'wally123'; GRANT USAGE ON * . * TO 'wally'@'\%' IDENTIFIED BY 'wally123' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ; GRANT ALL PRIVILEGES ON ``wally\\\_\%`` . * TO 'wally'@'\%'; "

现在它确实创建了 localhost 用户和数据库,但不是我认为可能涉及符号 % 的外部用户,我试图对其进行 scape 并复制它,但仍然无法正常工作。

谢谢 !

4

4 回答 4

0

用单引号替换整个字符串周围的双引号,然后在每个内部单引号之前放置反斜杠 - 或 - 使用"双引号将所有带引号的参数和'单引号切换到您想要的整个字符串MySQL 来执行。

双引号是比单引号“弱”的引号字符,当它们被双引号括起来时,shell 仍会尝试解释某些字符......但不是单引号。

有关此处发生的事情的更多详细信息,请参阅此 DBA.se 答案。

于 2013-09-24T05:11:11.260 回答
0

您是否尝试过转义单引号?

"CREATE USER \'wally\'@\'localhost.....
于 2013-09-24T03:50:36.397 回答
0

反引号是问题所在:它们是一个 shell 字符,在 SSH 命令行连接到远程服务器之前被评估。你应该用反斜杠转义每个。

于 2013-09-24T04:06:36.787 回答
0

当我需要在命令行上运行超过 1-2 个 SQL 时,我通常将它们全部放在一个文本文件中,然后通过以下方式运行:

mysql -uMYUSER -pMYPASS < /path/to/my/file

当有特定字符(外文字母 UTF-8 编码)时,它也很有用。

于 2013-09-24T05:05:45.580 回答