Toon posts:

[MYSQLi] Prepared statments

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik probeer een database class te schrijven voor een nieuw project.
Het is de eerste keer dat ik met (mysqli) prepared statements werk.
Ik wil een 'query' functie, waar standaard de attributen die nodig zijn worden meegegeven. De functie aanroep ziet er dan zo uit:
PHP:
1
$db->query('INSERT INTO tablename (field1,field2) VALUES (?,?)' , 'ss' , array('value1',"value2"));
Ik heb dit nu al werkend gekregen voor een 'insert/update' query, maar hoe je het resultaat van een query returned, weet ik niet. Het is dus de bedoeling dat ik ongeveer zoiets doe:
PHP:
1
2
3
4
5
$result=$db->query('SELECT * FROM tablename WHERE nickname=?' , 's' , 'ik';
while ($row=$result->fetch_object())
{
//Doe iets
}


De functie die ik heb is:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    public function query($sql,$bind_param_type=null,$bind_param_array=null)
    {
        if (!isset($bind_param_type) OR !isset($bind_param_array))
        {
            return $this->mysqli->query($sql);
        }
        else
        {
            $stmt = $this->mysqli->prepare($sql);
            //Code die bind_param doet met array weggelaten 
            $stmt->execute();
            $stmt->close();
        }
    }

Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 21-09 15:23
Met de fetch_array functie kan het volgens mij, dat is wel te vinden op php.net/mysqli

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • fleppuhstein
  • Registratie: Januari 2002
  • Laatst online: 07-09 13:37
Zo een mooie class bestaat al, PDO (Php Data Objects). Hiermee kan je preparedstatements uitvoeren. Parameters binden etc. Zelfs transactions zijn mogelijk.

Hiermee heb je gelijk al een complete class. En niet een function library zoals je zelf voorbeelden geeft.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php

// PDO Example


$dbh = //PDO connection string
$stmt = $dbh->prepare('SELECT * FROM table WHERE `id` = :id')
// Method 1.
$stmt->bind(':id', $id);
$stmt->execute();
// Or
$stmt->execute(array('id' => $id));

// Fetch results
$results = $stmt->fetch(PDO::FETCH_ASSOC);

?>

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik zal tegoei kijken naar die PDO, en wat experimenteren.
De bedoeling is nog altijd van in de phpcode met 1 functie-aanroep het result te hebben van een prepared statement.
Bedankt voor de hulp.

Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 21-09 15:23
Mysqli kan je ook als object aanroepen dacht ik :)

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • fleppuhstein
  • Registratie: Januari 2002
  • Laatst online: 07-09 13:37
ZpAz schreef op maandag 16 februari 2009 @ 22:00:
Mysqli kan je ook als object aanroepen dacht ik :)
Correct, maar ook op functie niveau. Hierdoor kan je fouten maken omdat je ze niet mag combineren.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik post even de oplossing die ik nu heb (zonder PDO).
Ik wou een prep. statement gewoon heel makkelijk in gebruik maken. Eén regel ipv elke keer 4.
Met de functie die ik nu heb, kan ik zoiets doen:
PHP:
1
2
3
4
5
6
$username="' OR ''='"; //of enige andere input door gebruiker
$result=$db->query("SELECT * FROM users WHERE nickname=?",'s',$username);
foreach($result as $row)
{
// doe iets met $row->column
}


Voor wie het wilt weten, dit is de functie die ik ervoor heb (is dus onderdeel van een class.)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
public function query($sql,$bind_param_type=null,$bind_param_array=null)
    {
        
            $sql=str_replace('[pretable]',$this->pretable,$sql);
            if (!$stmt = $this->mysqli->prepare($sql)){errorlog('error',"Er is een mysql query mislukt.\r\n Errorstring:". $this->mysqli->error); return false;}
            if (isset($bind_param_type) AND isset($bind_param_array)){
            if (gettype($bind_param_array)!='string'){
            $bind_names[] = $bind_param_type;
            for ($i=0; $i<count($bind_param_array);$i++)
            {
                $bind_name = 'bind' . $i;
                $$bind_name = $bind_param_array[$i];
                $bind_names[] = &$$bind_name;
            }
            call_user_func_array(array($stmt,'bind_param'),$bind_names);
            }
            else
            {
            $stmt->bind_param($bind_param_type,$bind_param_array);
            }}
            $stmt->execute();
            if (isset($stmt->errno)){errorlog('error',"ER is een mysql query mislukt(2). \r\n Errostring:".$stmt->error);}
            $this->affected=$stmt->affected_rows;
            $this->insert_id=$stmt->insert_id;
            if($metadata = $stmt->result_metadata())
            {
            $fields = $metadata->fetch_fields();

            for (;;)
            {
                $pointers = array();
                $row = new stdClass();
       
                $pointers[] = $stmt;
                foreach ($fields as $field)
                {
                    $fieldname = $field->name;
                    $pointers[] = &$row->$fieldname;
                }
                call_user_func_array('mysqli_stmt_bind_result', $pointers);
                if (!$stmt->fetch()){break;}
                $result[] = $row;
            }
     
            $metadata->free(); 
            $stmt->close();
            $this->teller++;
            if (isset($result)){return $result;}else{return true;}
        }
        
    }
Pagina: 1