php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #78870 Connection errors appear in error.log
Submitted: 2019-11-26 13:13 UTC Modified: 2019-11-26 15:02 UTC
Votes:1
Avg. Score:3.0 ± 0.0
Reproduced:1 of 1 (100.0%)
Same Version:0 (0.0%)
Same OS:0 (0.0%)
From: hhsnakeg at gmail dot com Assigned:
Status: Open Package: MySQLi related
PHP Version: 7.2.24 OS:
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: hhsnakeg at gmail dot com
New email:
PHP Version: OS:

 

 [2019-11-26 13:13 UTC] hhsnakeg at gmail dot com
Description:
------------
When I use persist connection on PHP use call mysqli_real_connect with parameter host 'p:localhost' causes error connection when I call the connection second time.
After that, a new database connection is created with a new id.

When we connect to the database for the first time we see a message in the general log:
454 Connect   dbuser@localhost on dbscheme using Socket
When we reuse connection (connect second time) we see a message in the general log:
454 Connect   Access denied for user 'dbuser'@'localhost' (using password: NO)
455 Connect   dbuser@localhost on dbscheme using Socket
and in the error log we see the same message:
454 [Note] Access denied for user 'dbuser'@'localhost' (using password: NO)

I think this error appeared after changes in version 7.2.24 (Fixed bug #76809 (SSL settings aren't respected when persistent connections are used).


Test script:
---------------
<?php

function connect()
{
    $connectionID = mysqli_init();
    $ok = mysqli_real_connect($connectionID,
        'p:localhost',
        'dbuser',
        'dbpass',
        'dbscheme',
        3306,
        "",
        0);
    mysqli_select_db($connectionID, 'dbsheme');
}

connect();
connect();


Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2019-11-26 13:47 UTC] cmb@php.net
-Status: Open +Status: Feedback -Assigned To: +Assigned To: cmb
 [2019-11-26 13:47 UTC] cmb@php.net
Just to clarify:
 - are you using PHP 7.2.25 or 7.2.24?
 - which driver do you use – mysqlnd or libmysqlclient?
 [2019-11-26 14:56 UTC] hhsnakeg at gmail dot com
1. use 7.2.24 

2. use mysqlnd 5.0.12-dev - 20150407 - $Id: 3591daad22de08524295e1bd073aceeff11e6579 $ 
($connectionID->get_client_info();)
Package: php7.2-mysql 
Version: 7.2.24-1+ubuntu18.04.1+deb.sury.org+1
Provides: php-mysqli, php-mysqlnd, php-pdo-mysql, php7.2-mysqli, php7.2-mysqlnd, php7.2-pdo-mysql
 [2019-11-26 15:02 UTC] cmb@php.net
-Status: Feedback +Status: Open -PHP Version: 7.2.25 +PHP Version: 7.2.24 -Assigned To: cmb +Assigned To:
 [2019-11-26 15:02 UTC] cmb@php.net
Thanks!
 [2019-12-14 18:05 UTC] drtechno at mail dot com
I think you have something going on with the your function.  you need to sense if it exists, and the connection scheme is installed (if you are looking for deployment) Try:

a fixed version of the Procedure style in a function (which I would not recommend):

function connect(){
if(!isset($connectionID)){
$connectionID = mysqli_init();
if (!$connectionID){die("mysqli_init failed");}
 
mysqli_real_connect($connectionID,'localhost', 'dbuser', 'dbpass', 'dbscheme');
}}


connect();


But you shouldn't use a connect in a function ever!
 You should always control the connection state, and close the connection at the end of page.... use "require" call then   mysqli_close($con); at the end of working with the database, in your php page.
But If you need to call a connection, within a page, I recommend checking it first:

if(!isset($connectionID)){
$connectionID = mysqli_init();
$con= mysqli_real_connect($connectionID,'localhost', 'dbuser', 'dbpass', 'dbscheme');
}

Here is an object oriented version:

$mysqli = mysqli_init();
if (!$mysqli) {die("mysqli_init failed");}
$con -> real_connect("localhost","dbuser","dbpass","my_db");



Just remember to  use the procedural: mysqli_close($con); or the object oriented: $mysqli -> close(); to close the connection at the bottom of your php page.
 [2019-12-14 18:50 UTC] bugreports at gmail dot com
> Just remember to  use the procedural: mysqli_close($con); 
> or the object oriented: $mysqli -> close(); to close the 
> connection at the bottom of your php page

please stop to educate closing mysql connections!

PHP does it at it's own at the end of the request when it#s not a persistent connection and if you ever decide to use persistent connections by 'p:localhost' instead 'localhost' you will regret your mysqli_close() which is less smart than PHP
 [2019-12-16 15:23 UTC] hhsnakeg at gmail dot com
To drtechno at mail dot com.
Please read the contents carefully before commenting. It is a persist connection and errors that occur when using it. I wrote a simple example of how to repeat the error, as required by the bug report tracker. If it’s convenient for someone, you can skip connect(); 2 times, but in this case you will need to reload the page 2 times. Don't like a function call? write without a function, the meaning will not change. Please do not write nonsense if you do not understand the topic. Good luck.

This connection style is used in the ADODB library.
https://github.com/ADOdb/ADOdb/blob/master/drivers/adodb-mysqli.inc.php
function _connect() lines 89-144 in current master branch.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sun Oct 27 16:01:27 2024 UTC