当我使用 PHP、MySQLI 并激活 SSL 连接到外部 MySQL-DB (MariaDB 10) 时...:
/* create a connection object which is not connected */
$conn = new mysqli();
$conn->init( );
/* set connection options */
$conn->options( MYSQLI_OPT_CONNECT_TIMEOUT, $timeout );
/*connect to server*/
$conn->real_connect($SQL_Server, $SQL_Benutzer, $SQL_Passwort, $SQL_Datenbank, 3306, NULL, MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT);
...我无法使用:
mysqli_real_escape_string($conn, $_GET['clientid'])
...或者...
$conn->mysqli_real_escape_string($_GET['clientid'])
结果将为空。当我禁用 SSL 时...:
$conn->real_connect($SQL_Server, $SQL_Benutzer, $SQL_Passwort, $SQL_Datenbank, 3306);
...它会起作用的。
在我的带有 XAMPP 的 iMac 上,它也可以使用 SSL 连接。仅当我使用 PHP7.1 将 PHP 脚本上传到我的网站空间 (Strato www.strato.de) 时,它才无法与 SSL 连接一起使用。
那么,为什么我不能在我的网站空间上使用带有 ssl 连接的“escape_string”?
编辑:
这就是我检查连接错误的方式:
function sql_connect($Datenbank){
$Servernr = get_ServerNr();
$Server = get_Server($Servernr);
$SQL_Servernr = $Server->Nr;
$SQL_Server = $Server->Url;
$SQL_Benutzer = $Server->Benutzer;
$SQL_Passwort = $Server->Passwort;
$SQL_Datenbank = $Datenbank;
$timeout = 5;
$conn = new mysqli();
$conn->init( );
$conn->options( MYSQLI_OPT_CONNECT_TIMEOUT, $timeout );
$conn->real_connect($SQL_Server, $SQL_Benutzer, $SQL_Passwort, $SQL_Datenbank, 3306, NULL, MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT);
if ($conn->connect_errno) {
echo $conn->connect_errno;
die();
}
return $conn;
}
编辑2:
现在我激活了E_ALL-错误报告:
注意:使用未定义的常量 MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT - 在第 101 行 /mnt/web022/d2/18/51779718/htdocs/webservice_config/dbserver2.php 中假设为“MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT”
警告:mysqli::real_connect() 期望参数 7 为整数,在第 101 行 /mnt/web022/d2/18/51779718/htdocs/webservice_config/dbserver2.php 中给出的字符串
警告:mysqli_real_escape_string():第 34 行 /mnt/web022/d2/18/51779718/htdocs/webservice_imikelgo/test.php 中的无效对象或资源 mysqli
警告:mysqli_query():第 38 行 /mnt/web022/d2/18/51779718/htdocs/webservice_imikelgo/test.php 中的无效对象或资源 mysqli
致命错误:未捕获错误:在 /mnt/web022/d2/18/51779718/htdocs/webservice_imikelgo/test.php:40 中对 null 调用成员函数 fetch_assoc() 堆栈跟踪:#0 {main} 抛出在 /mnt 中/web022/d2/18/51779718/htdocs/webservice_imikelgo/test.php 第 40 行
使用 XAMPP 我不会收到此通知。我该如何解决这个问题?
尼科·谢瑟。问题是为什么我需要将我的新 mysqli 更改为另一种新类型。下面的解决方案代码扩展了使用正确的 ssl 方式覆盖 mysqli 的 __construct 。
class ssl_mysqli extends \mysqli {
public function __construct($db_host, $db_user, $db_pass, $db_name, $port, $persistent = true, $ssl = false, $certpublic = "") {
if($ssl) {
parent::init();
parent::options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, false);
parent::ssl_set(NULL, NULL, $certpublic, NULL, NULL);
parent::real_connect(($persistent ? 'p:' : '') . $db_host, $db_user, $db_pass, $db_name, $port, '', MYSQLI_CLIENT_SSL | MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT );
//https://bugs.php.net/bug.php?id=68344
} else {
parent::__construct($db_host, $db_user, $db_pass, $db_name);
}
}
以上代码是在我自己的认证下设置的。所以可信证书已关闭。很酷