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
From: hhsnakeg at gmail dot com Assigned:
Status: Open Package: MySQLi related
PHP Version: 7.2.24 OS:
Private report: No CVE-ID: None
View Add Comment Developer Edit
Welcome! If you don't have a Git account, you can't do anything here.
You can add a comment by following this link or if you reported this bug, you can edit this bug over here.
(description)
Block user comment
Status: Assign to:
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

Add a Patch

Pull Requests

Add a Pull Request

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-2020 The PHP Group
All rights reserved.
Last updated: Wed Aug 12 18:01:26 2020 UTC