简体   繁体   中英

PDO query returning empty

I have a Connection class file which allows my other class "Functions" to connect to my MySQL database. However, when I execute a MySQL query, it returns with just Array () . The data I'm selecting is, in fact, there (I checked). What could the problem be?

Connection.php

 <?php

 class Connection extends PDO {

 private $username;
 private $password;
 private $database;
 private $hostname;

 public function __construct($hostname, $username, $password, $database) {

    $this->hostname = $hostname;
    $this->username = $username;
    $this->password = $password;
    $this->hostname = $hostname;

    try {
        parent::__construct("mysql:host=" . $this->hostname . ";dbname=" . $this->database, $this->username, $this->password);
    }

    catch (PDOException $e) {
        echo $e->getMessage();
    }
  }
}

?>

Functions.php

<?php

require_once "Connection.php";

class Functions {

private $connection;

public function __construct() {
    $this->connection = new Connection("127.0.0.1", "xxx", "xxx", "xxx");
}

public function sqlFetchAssoc($query) {

    $sth = $this->connection->prepare($query);
    $sth->execute();
    $result = $sth->fetchAll(PDO::FETCH_ASSOC);

    return $result;
    }
}

$functions = new Functions();
$row = $functions->sqlFetchAssoc("SELECT * FROM chatlogs WHERE id = 70");

print_r($row);

?>

I just spotted your bug in Connection.php :

$this->hostname = $hostname;
$this->username = $username;
$this->password = $password;
$this->hostname = $hostname;

$this->hostname is repeated while $this->database is not set . However, you can strip altogether setting the $this->something , since you are using those values in the same function. This will make it simpler:

try {
    parent::__construct("mysql:host=" . $hostname . ";dbname=" . $database, $username, $password);
}

I'd recommend going a step further. You should test each class separately. You can write this script and debug it (if needed) in testfunction.php :

<?php
class Functions {
private $connection;

public function __construct() {
    $this->connection = new PDO("mysql:host=127.0.0.1;dbname=xxx", "xxx", "xxx");
}

public function sqlFetchAssoc($query) {

    $sth = $this->connection->prepare($query);
    $sth->execute();
    $result = $sth->fetchAll(PDO::FETCH_ASSOC);

    return $result;
    }
}

echo "Test started <br><br>";
echo "Initialization: <br>";
$functions = new Functions();
echo "Correct<br><br>";
echo "Performing a select: <br>";
$row = $functions->sqlFetchAssoc("SELECT * FROM chatlogs WHERE id = 70");
print_r($row);
echo "Test finished.";
?>

Then do something similar for the first class. Then not only it will be easier to spot the bug, but should a bug happen, you can come to these tests to see what went wrong instead of writing them all again. Remember not to include them in production code.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM