Question

I have changed some of my old queries to the Mysqli framework to improve performance. Everything works fine on localhost but when i upload it to the webserver it outputs nothing. After connecting I check for errors and there are none. I also checked the php modules installed and mysqli is enabled.

I am certain that it creates a connection to the database as no errors are displayed. (when i changed the database name string it gave the error)

There is no output from the query on the webserver, which looks like this:

$mysqli = new mysqli("server", "user", "password");

if (mysqli_connect_errno()) {
   printf("Can't connect Errorcode: %s\n", mysqli_connect_error());
   exit;
}

// Query used  
$query = "SELECT name FROM users WHERE id = ?";

if ($stmt = $mysqli->prepare("$query")) 
{

    // Specify parameters to replace '?'
    $stmt->bind_param("d", $id);  

    $stmt->execute();

    // bind variables to prepared statement 
    $stmt->bind_result($_userName);

    while ($stmt->fetch()) 
    {
          echo $_userName;
    }


    $stmt->close();
 }
}

//close connection 
$mysqli->close(); 

As I said this code works perfectly on my localserver just not online. Checked the error logs and there is nothing so everything points to a good connection. All the tables exists as well etc. Anyone any ideas because this one has me stuck! Also, if i get this working, will all my other queries still work? Or will i need to make them use the mysqli framework as well? Thanks in advance.

EDIT:

Ok Ive done some 'debugging' to see what is happening. There is data in the table i'm querying that matches the query. I did the following to check the prepare statement:

echo "debug 1";

if ($stmt = $mysqli->prepare("$shiftQuery"))  
{

echo "debug 2";
printf("Error: %s.\n", $stmt->error);

etc...
}

So basically it should output 'debug 1' before the statment is prepared (Which it does). Then after it should output 'debug 2' and any errors that occured.

The problem is here somewhere as it doesnt reach the debug 2 line in the IF statement. Since the connection details are fine, i cant really see why the $mysqli object wouldnt be created. That give anyone any further ideas???

thanks

No correct solution

OTHER TIPS

Each call to a mysqli/stmt method can fail. You should check each and every one.
Try it with error_reporting(E_ALL) and maybe display_error=On

<?php
error_reporting(E_ALL); ini_set('display_errors', 1);

// passing database name as fourth parameter
$mysqli = new mysqli("server", "user", "password", 'dbname');
if (mysqli_connect_errno()) {
   printf("Can't connect Errorcode: %s\n", mysqli_connect_error());
   exit;
}

// Query used  
$query = "SELECT name FROM users WHERE id = ?";

if ( false===($stmt=$mysqli->prepare("$query")) ) {
  echo 'mysqli::prepare failed: ', htmlspecialchars($mysqli->error);
  die;
}

// Specify parameters to replace '?'
$rc = $stmt->bind_param("d", $id);  
if ( !$rc ) {
  echo 'bind_param failed: ', htmlspecialchars($stmt->error);
  die;
}

echo '<pre>Debug: execute()</pre>';
$rc = $stmt->execute();
if ( !$rc ) {
  echo 'execute failed: ', htmlspecialchars($stmt->error);
  die;
}

echo '<pre>Debug: bind_result()</pre>';
// bind variables to prepared statement 
$rc = $stmt->bind_result($_userName);
if ( !$rc ) {
  echo 'bind_result failed: ', htmlspecialchars($stmt->error);
  die;
}

echo '<pre>Debug: fetch()</pre>';
while ($stmt->fetch()) 
{
  echo 'username: ', $_userName;
}
echo '<pre>Debug: stmt close()</pre>';
$stmt->close();

echo '<pre>Debug: mysqli close()</pre>';
$mysqli->close();

MySQL user permission is host sensitive -- it may give user1 from localhost and user1 from other host different permission.

GRANT ALL ON *.* TO user@'%' IDENTIFIED BY 'password';

Mysqli framework does not improve performance.
Error checking must be done not only after connect but after each query execute.

Check $stmt->error for errors
Or try to check against throwed exception

Is Id an integer? I normally run my mysqli like

$sql = "SELECT name FROM users WHERE id = ?";
            if($stmt = $mysqli->mysqli->prepare($sql)){
              $stmt->bind_param("i", $id);
                    if($stmt->execute()){
                        $stmt->bind_result($name);
                        $stmt->store_result();
                        if($stmt->fetch()){
                            return $name;
                         }else{
                             return 'Not Found';
                         }      
                    }else{
                        return 'Execute Error';
                    }

            }else{
                return 'SQL Error';
            }

Hope that helps

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow