MySQLi

I och med PHP version 7 slutar de klassiska mysql-funktionerna i PHP att fungera, och då använder du istället MySQLi eller PDO för att hantera dina databasanslutningar. Båda innehåller en hel del förbättringar (i:et i MySQLi står för ”improved”). Ökad säkerhet är en viktig aspekt, och den uppnår du bland annat med så kallade prepared statements.

Hämta data från databasen

Att ansluta till databasen är enkelt. Lägg in de korrekta uppgifterna för din databas, så är du ansluten. Här passar vi även på att ställa in teckenkodningen, vilket är bra om du till exempel vill att åäö ska fungera som det ska.

$mysqli = new mysqli(
  "server", 
  "användarnamn", 
  "lösenord", 
  "databasnamn"
);
$mysqli->set_charset("utf8");

Istället för att köra frågan direkt skapar vi ett prepared statement. Det är sedan det här statementet vi kör.

$query = "SELECT `id`, `name`, `age` FROM `friends`;";
$stmt = $mysqli->prepare($query);
$stmt->execute();

Du kan hämta resultatet från databasen på flera olika sätt. Ett sätt är att använda funktionen get_result, som nedan. Från den funktionen får du arrayer där du enkelt hittar ditt resultat.

$result = $stmt->get_result();
while ($row = $result->fetch_assoc())
{
    var_dump($row);
}
array(3) {
  ["id"]=>
  int(1)
  ["name"]=>
  string(14) "Anna Andersson"
  ["age"]=>
  int(42)
}
array(3) {
  ["id"]=>
  int(2)
  ["name"]=>
  string(16) "Bosse Bertilsson"
  ["age"]=>
  int(25)
}

Att frigöra resultatet och stänga objekten efter dig är en god vana. På så sätt frigör du minne och databasanslutningar.

$result->free();
$stmt->close();
$mysqli->close();

Lägg till en post i databasen

När du använder prepared statements lägger du aldrig in variabler direkt i SQL-frågan. Istället anger du frågetecken som platshållare där variablerna senare ska infogas. Styrkorna med prepared statements – att samma fråga kan köras om och om igen, och att SQL-injektioner automatiskt hindras – bygger på just det här.

$mysqli = new mysqli(
  "server", 
  "användarnamn", 
  "lösenord", 
  "databasnamn"
);
$mysqli->set_charset("utf8");
$query = "INSERT INTO `friends` (`name`, `age`) VALUES(?, ?);";
$stmt = $mysqli->prepare($query);

Metoden bind_param binder variabler till de frågetecken du angav i SQL-frågan. Det första argumentet anger vilken typ variablerna har. Övriga argument är de variabler du vill binda. Observera att du måste ange dem i samma ordning som frågetecknen i SQL-frågan.

$name = 'Cecilia';
$age = 52;
$stmt->bind_param('si', $name, $age);
$stmt->execute();
Möjliga datatyper:
i = integer
d = double
s = string
b = blob

Innan databasen stängs kan du hämta ut det ID som sattes på posten du nyss infogade.

$last_inserted_id = $mysqli->insert_id;
$stmt->close();
$mysqli->close();

Felhantering

För enkelhetens skull har exemplen ovan inga funktioner för att upptäcka fel. Det här exemplet visar hur du kan fånga upp dem.

$mysqli = new mysqli(
  "server", 
  "användarnamn", 
  "lösenord", 
  "databasnamn"
);
if ($mysqli->connect_errno) 
{
    printf(
        "Failed connecting to the database: %s",
        $mysqli->connect_error
    );
    return false;
}

if (!$mysqli->set_charset("utf8")) 
{
    printf("Failed setting the charset: %s", $mysqli->error);
    return false;
}

$query = "INSERT INTO `friends` (`name`, `age`) VALUES(?, ?);";
$stmt = $mysqli->prepare($query);

if (!$stmt)
{
    printf("Failed preparing the statement: %s", $mysqli->error);
    return false;
}
$name = 'Cecilia';
$age = 52;

if (!$stmt->bind_param('si', $name, $age))
{
    printf("Failed binding the parameters");
    return false;
}

if (!$stmt->execute()) 
{
    printf("Failed executing the statement: %s", $stmt->error);
    return false;
}

$stmt->close();
$mysqli->close();

Prepared statements med okänt antal parametrar

Ibland vet du inte i förväg hur många parametrar du vill skicka in i ditt statement. Det kan vara fallet när du till exempel har ”WHERE … IN …” i din SQL-fråga. Här är ett exempel på hur du kan lösa det.

$mysqli = new mysqli(
  "server", 
  "användarnamn", 
  "lösenord", 
  "databasnamn"
);
if ($mysqli->connect_errno) 
{
    printf(
        "Failed connecting to the database: %s",
        $mysqli->connect_error
    );
    return false;
}

if (!$mysqli->set_charset("utf8")) 
{
    printf("Failed setting the charset: %s", $mysqli->error);
    return false;
}

$parameters = array(
    array('i', 18),
    array('i', 25),
    array('i', 42),
);

$placeholders = implode(',', array_fill(0, count($parameters), '?'));

$query = "SELECT `id`, `name`, `age` FROM `friends` 
    WHERE `age` IN ($placeholders);";

$stmt = $mysqli->prepare($query);
if (!$stmt)
{
    printf("Failed preparing the statement: %s", $mysqli->error);
    return false;
}
$bind_data[] = "";
foreach ($parameters as $key => $value) 
{
    $bind_data[0] .= $value[0];
    $bind_data[] = &$parameters[$key][1];
}

if (count($bind_data) > 1)
{
    $ret = call_user_func_array(
        array($stmt, 'bind_param'), 
        $bind_data
    );
    if (!$ret)
    {
        printf("Failed binding the parameters");
        return false;
    }
}

if (!$stmt->execute()) 
{
    printf("Failed executing the statement: %s", $stmt->error);
    return false;
}

$result = $stmt->get_result();

while ($row = $result->fetch_assoc())
{
    var_dump($row);
}

$result->free();
$stmt->close();
$mysqli->close();
Was this article helpful?

Related Articles

Få hjälp via fjärrsupport

Klicka på knappen nedan för att starta fjärrsupport via ISL. Ange sessionskoden du fått från oss och klicka på Anslut, så är vi med dig alldeles strax!

Starta fjärrsupport