Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

Prepared Statements icm. array als input

Pagina: 1
Acties:

  • Sgrovert
  • Registratie: Mei 2004
  • Laatst online: 23-11 10:50
Sinds een paar dagen ben ik aan het uitzoeken hoe prepared Statements vo SQL werken. Ik ben een simpele functie aan het maken welke een array aan data in een tabel kan toevoegen.

Mijn input ziet er als volgt uit :
PHP:
1
2
3
4
5
6
7
8
9
    //$data moet er als volgt uitzien :
    // array('veldnaam' => array('data type','data'),'veld 2' => array('type','data'),etc)
    //Mogelijke types zijn :
    // i = integer;
    // s = string;
    // d = double;
    // b = blob;
$data = array('field1' => array('s','string'), 'field2' => array('s','value'));
insertData(table',$data);


En de functie zelf :
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function insertData($tableName,$data) {
    $mysqli = new mysqli("localhost", "userName", "Pass", "dbName");

    $fieldName=array(); //Veld Namen
    $fieldType=array(); //Data Type
    $fieldValue=array(); //Data
    $values=array(); //Generen van ? in Query
    foreach($data as $field => $content) {
        array_push($fieldName,$field);
        array_push($fieldType,$content[0]);
        array_push($fieldValue,$content[1]);
        array_push($values,'?');
    }
    $preparedStatement='INSERT INTO `'.$tableName.'` (`'.implode($fieldName,'`,`').'`) values ('.implode($values,',').')';
    if ($stmt = $mysqli->prepare("$preparedStatement")) {
        /* Bind our params */

        $stmt->bind_param(implode($fieldType), $fieldValue);
    
    } else {
        echo'Error 473';
    }
}


Deze code lever mij de volgende warning op : "PHP Warning: Parameter 2 to mysqli_stmt::bind_param() expected to be a reference, value given in .."

Ik heb een redelijk vermoeden waarom ik de warning krijg, maar hoe los ik dit netjes op? De grootte van mijn array is namelijk variabel.

Lost In Music


  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Dan genereer je een variabel aantal queries.
Het punt van parametrized queries is dat je je query niet dynamisch met concatenatie opbouwt. Iets dat je hier dus precies wel aan het doen bent..

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • Merethil
  • Registratie: December 2008
  • Laatst online: 05:37
Is het niet zo simpel als:

PHP:
1
2
3
4
for($i = 0 ; $i < count($fieldType) ; $i++)
{
    $stmt->bind_param($fieldType[$i], $fieldValue[$i]);
}


Of is dit niet wat je zoekt?

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 22-11 13:46

Janoz

Moderator Devschuur®

!litemod

Waarom maak je weer een nieuwe wrapper om iets dat eigenlijk al een wrapper is? Je voegt een stuk eigen syntax toe welke nauwelijks winst oplevert tov gewoon rechtstreeks de prepared statement code uitschrijven. Voegt een berg potentiele bugs toe, en maakt het onderhoud voor anderen (want eigen wiel), maar ook jezelf (niet gevalideerde string configuratie welke je in een zelf bedacht arrayboom probeert te plaatsen) een stuk lastiger.

In mijn opinie ben je vanuit de verkeerde kant aan het generaliseren. Ga niet proberen je database toegang nog makkelijker te maken, want dat kan eigenlijk niet zonder generiekheid te verliezen. Redeneer vanuit je eigen entiteiten. Jij wil een persoon opslaan? Maak dan een persoon methode welke gewoon de parameters mee krijgt die je nodig hebt, zoals bijvoorbeeld naam enzo (of maak een persoon class welke alle benodigde gegevens erin heeft zitten)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Sgrovert
  • Registratie: Mei 2004
  • Laatst online: 23-11 10:50
Allemaal bedankt voor de reacties. Ik heb besloten om voor de optie van Janoz te gaan. Losse Methodes zijn op de lange termijn inderdaad makkelijker.

Lost In Music


  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 21:50
Je kan ook naar een ORM kijken, bijvoorbeeld Doctrine of Eloquent van Laravel (Ook als los project), dan kan je heel simpel een model maken en je data aanpassen.

Voorbeeldjes:
Fluent Query Builder
PHP:
1
2
3
4
5
$user = DB::table('users')->first();
DB::table('users')->insert(array('email' => 'example@gmail.com'));
$affected = DB::table('users')
    ->where('id', '=', 1)
    ->update(array('email' => 'new_email@gmail.com'));

Eloquent ORM
PHP:
1
2
3
4
5
6
7
8
$user = User::find(1);
//Of voor een nieuwe user
$user = new User;

$user->email = 'new_email@gmail.com';
$user->password = 'new_secret';

$user->save();

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Even een kick naar PRG (Waar hoort mijn topic?)
WEB » PRG

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1