Maak pdo :: query static

Ik krijg deze foutmelding als ik de onderstaande code voer. Ik heb normaal de msqlfuncties gebruikt maar ik heb geprobeerd om in plaats daarvan de PDO te gebruiken. Wat is er mis ?

Fatale fout: niet-statische methode PDO :: query() kan statisch niet worden aangeroepen op regel 14

<?php 

if(isset($_POST['username']) AND isset($_POST['password'])) {

$username = $_POST['username'];
$password = $_POST['password'];
$password_hash = md5($password);

if (!empty($username) AND !empty($password) ) {


$query = "SELECT 'id' FROM `userdatabase` WHERE 'email'='$username' AND      'password'='$password_hash'";

if($query_run = PDO::query($query)){

$query_num_rows = PDO::rowcount($query_run);
if ($query_num_rows==0){
echo 'invalid password/username';

} else {
echo 'Username/password  = correct';
}


}


} else {
echo 'You must enter a password..';
}

} 


?>
3

4 antwoord

Allereerst, als u de statische methode kunt gebruiken, hoe denkt u dan verbinding te maken met uw database?

PDO moet een instantie zijn omdat de constructor ( __ construct() ) verbinding maakt met de database. Als u statische methoden hebt, kunt u PDO :: __ construct ($ params) niet uitvoeren, omdat PHP geen statische constructor heeft.

Dus, maak een PDO:

$pdo = new  PDO('mysql:dbname=testdb;host=localhost', 'root', 'password');

En doe de vraag:

$result = $pdo->query('SELECT * FROM table WHERE 1=1');
3
toegevoegd

:: sign is used to call methods that are defined as static, which means you don't need to create instance of an object to call this method. query() method is not static which means that you need to create PDO object first and then call query() method on that object.

Dit zou er als volgt uit moeten zien:

$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';
$pdo = new  PDO($dsn, $user, $password);
$result = $pdo->query('SELECT * FROM table');  //here $result is a set of results that can be accessed like arrays;
3
toegevoegd
1 ding om in gedachten te houden: resultaat houdt vast, wat een PDOStatement wordt genoemd, niet het werkelijke resultaat van de query, om die te benaderen: $ actualResults = $ result-> fetchAll (PDO :: FETCH_ASSOC); , of 1 op 1 while ($ row = $ results-> fetch (PDO :: FETCH_ASSOC)) {echo $ row ['afield'];}
toegevoegd de auteur Elias Van Ootegem, de bron

De foutmelding zegt het allemaal. U roept de methode query op als een statische methode (een methode waarvoor de klasse niet hoeft te worden geïnstantieerd), terwijl deze geen statische methode is.

Gewoon om een ​​beetje meer achtergrondinformatie te geven over waarom je het geen statische functie kunt maken (aangezien je vraag me doet geloven dat je deze fout wilt oplossen).

  • When instantiating the PDO object, you pass the database host, username, password, type of db and default databse to its constructor. (these are not all required parameters). A connection to the database server is established, so you can query for data.

  • If your query method were static, you'd either have to connect, query, disconnect and return the results, for each query you want to run. Obviously this is not a good approach.

  • The PDO object allows you to do much, much more than just executing queries: suppose your DB is running on the InnoDB engine. A static query method would just attempt to execute a DELETE query, but leaves no room for a safety net when things go wrong. PDO provides the $db->commit(); and $db->rollBack(); methods, to prevent data corruption.

Er zijn veel, veel meer goede redenen waarom je niet eens zou moeten nadenken over het uitbreiden van de PDO-klasse en het maken van statische lidfuncties, maar je kunt het zelf lezen als je de documenten .

In uw voorbeeld wilt u de rowcount krijgen nadat de query is uitgevoerd. Denk na over wat dat betekent: er is geen instantie om deze waarde toe te wijzen aan een van zijn eigenschappen, noch is er een verbinding met de database waarop u zojuist uw zoekopdracht hebt uitgevoerd. De enige manier om een ​​rowcount te krijgen in uw geval zou zijn om de query en telling opnieuw uit te voeren. IMO, dat is gewoon stom

2
toegevoegd

Uw vraag moet worden uitgevoerd op een databaseverbinding.

Your can't use query as a static function, but use $con->query() instead of.

Als er geen PDO-object is opgegeven, hoe weet dan welke benaming voor PDO is gebruikt? (je kunt er meer dan één hebben)

0
toegevoegd