未定义常量 MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT [重复]

问题描述 投票:0回答:1

当我使用 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 我不会收到此通知。我该如何解决这个问题?

php ssl mysqli
1个回答
-1
投票

尼科·谢瑟。问题是为什么我需要将我的新 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);
    }

}

以上代码是在我自己的认证下设置的。所以可信证书已关闭。很酷

© www.soinside.com 2019 - 2024. All rights reserved.