mysql på vei ut, mysqli på vei inn?

clinton4

Medlem
Hei,

Jeg ser det er mange mysql funksjoner som er på vei ut f.o.m PHP 5.5.0 og at det er mysqli som tar over. Er det da slik at man vil kunne bruke alle gamle mysql_xxxx funksjoner på samme vis dersom man endrer mysql til mysqli? f.eks mysql_connect blir mysqli_connect.
 

adeneo

Medlem
mysql funksjonene har vært "deprecated" siden versjon fire-ettellerannet av PHP (tar i litt nå), og det har vel vært anbefalt å bruke PDO i stedet i minst et par år nå?
 
Sist redigert:

Hanse

New Member
Ja, bruk PDO, som ble introdusert så tidlig som i 2005 og er overlegent mysql og mysqli-funksjonene på alle tenkelige måter. Eneste aberet er om man har en helvetes suppe av et legacy-system som må oppgraderes.
 

clinton4

Medlem
Holder på å leke litt med PDO og lurer på en ting.

Med mysql kan man bruke mysql_error(); for å se eventuelle feil i query. Hvordan gjøres dette med mysqli?
 

adeneo

Medlem
mysqli::$error

For PDO er det beskrevet i manualen:

PHP:
<?php
/* Provoke an error -- bogus SQL syntax */
$stmt = $dbh->prepare('bogus sql');
if (!$stmt) {
    echo "\nPDO::errorInfo():\n";
    print_r($dbh->errorInfo());
}
?>
 

clinton4

Medlem
Hmm.. Dette skjønte jeg ikke helt.

Dette er koden min:

PHP:
$mysqli = new mysqli('localhost', 'xxxx', 'xxxxx', 'xxxxxx');

if ($mysqli->connect_errno) {
    	echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}

$sql = $mysqli->query("SELECT * FROM table WHERE id = 5 LIMIT 1");

$row = $sql->fetch_assoc(); // Skal bare hente en rad, så trenger ikke noen loop.

echo $row['id'];

$mysqli->close();

Hvor og hva må jeg skrive for å vise en eventuell mysqli_error?
 

drlinux

Konsulent i PHP og Linux
For PDO, så kan du bruke exceptions, noe som generelt gjør feilhåndtering enklere. Her er et utsnitt av hvordan jeg setter opp database med PDO i en hjelpeklasse;

PHP:
class Applicationhelper {
    public $dbh;
    // ...

    public function __construct() {
        date_default_timezone_set('Europe/Oslo');

        $dsn = 'mysql:host=localhost;dbname=xxx;charset=utf8';
        $username = 'yyy';
        $password = 'zzz';

        $this->dbh = new PDO($dsn, $username, $password);
        $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }

    // ...
}

Den siste linjen setter at det skal brukes exceptions
 

clinton4

Medlem
Ok, dette var litt over mine PDO kunnskaper.

Jeg fikk til error med:

PHP:
if (!$mysqli){ echo $mysqli->error; }

Et par ting til jeg lurer på:

1. Jeg ser du bruker new PDO og ikke new mysqli. Hva er forskjellen?
2. Hva er forskjellen på $mysqli->query og $mysqli->prepare
 

drlinux

Konsulent i PHP og Linux
1. PDO er en databaseklasse, så $dbh må settes opp med new PDO(). mysqli* er funksjoner

2. query() er en enkeltstående spørring. prepare() setter opp en "prepared statement" som du senere kan utføre flere ganger med execute(). Det har litt fordel for ytelse, men du sikres også at alle input parametere escapes skikkelig
 

xdex

Medlem
Enkelt og greit, på tide og se på ruby on rails! :)

Neida, ikke alle er like, selv om jeg syntes og ser at PHP begynner og bli dårlig, og at andre språk sparer meg for flere timer i arbeid. Når det gjelder sqli bør du ta en titt her, PHP: Mysqli - Manual begynn på toppen, så lærer du det meste. Det er faktisk ikke så vanskelig.
 
Topp