Avatar billede mccookie Seniormester
24. marts 2014 - 23:46 Der er 17 kommentarer og
1 løsning

Mysqli parser med fejl på et parameter

Hej,

Jeg har brugt Ole Boles fortrinelige guide - Med succes.
Men nu er succesen mv. sluppet op..... :-(

Jeg et array hvor jeg igennem nogle test hælder en masse data i! 1. Fortæller jeg arrayet hvilke datanøgler og data der høre sammen

Til sidst laver jeg nogle strenge, som gerne skulle erstatte nogle i mine MySQLi kald....

1. streng: (Prepare)
INSERT INTO `m5` (`FK_afd_id`, `vaskeri_knr`, `vaskeri_adr`, `vaskeri_postnr`, `vaskeri_by`, `terminaltype`, `terminal_sw`, `m5hosting`, `rfid`, `wanip`, `mac`, `tilvalg`, `kommentar`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

2. streng Bind param:
'issssssssssss','19','12345','vej 1','8900','Randers','1','1.23','egenserver','prox','1.2.3.4','11:22:33:44:55:66','Adgangskontrol','dfgdfg'

Det resulterer i denne besked:
Warning: mysqli_stmt::bind_param(): Number of elements in type definition string doesn't match number of bind variables in /tjekoutput.php on line 613

Jeg skriver ligeledes det rå SQL ud og parser det direkte i phpmyadmin, så flyver det ind uden at brokke sig....

Nogen der lige kan komme og sige "DER!!!!"??
Avatar billede arne_v Ekspert
25. marts 2014 - 01:00 #1
maa vi se de relevante kodelinier?
Avatar billede Slettet bruger
25. marts 2014 - 01:20 #2
I nummer 1 har du 13 elementer.
I nummer 2 har du 14 elementer.

Det er bare derfor.
Avatar billede mccookie Seniormester
25. marts 2014 - 06:24 #3
Her er koden der danner linjen:

// Vi bygger en INSERT SQL til m5_vaskeri

$sql_vask_pre = "INSERT INTO `m5_vaskeri` (";

foreach(array_keys($terminal_arr) as $id) {
   
    // Datatypen hentes fra Array i øverste afsnit!
    // Er det I = Int eller S=String/text
    $datatyper_pre .= $datatype[$id];

    // Danner en streng med alle godkendte data!   
    $data_bind    .=  $terminal_arr[$id] . ",";

    // Pre SQL streng, hvor input erstattes af ?
    $sql_vask_pre .= "`" . $id . "`, ";
    }
   
    // Fjerne lige det sidste komma
    $sql_vask_pre = substr($sql_vask_pre,0,(strlen($sql_vask_pre)-2));
    $sql_vask_pre .= ") VALUES (";
   
    // Laver første del af en RAW sql, vi putter values ind istedet for ? ?
    $raw_sql = $sql_vask_pre;
   
    // Laver en streng med ?, svarende til antallet af parametre
    for($x = 0; $x<count($terminal_arr); $x++) { $value .= "?, "; }

    // Fjerne lige det sidste komma i ? streng
    $value = substr($value,0,(strlen($value)-2));
    $sql_vask_pre .= $value . ")";
   
    // Fjerner det sidste komma i de godkendte data
    $data_bind = substr($data_bind,0,strlen($data_bind)-1);


Array ( [0] => FK_afd_id [1] => vaskeri_knr [2] => vaskeri_adr [3] => vaskeri_postnr [4] => vaskeri_by [5] => terminaltype [6] => terminal_sw [7] => m5hosting [8] => rfid [9] => wanip [10] => mac )

sql_vask_data:
'issssssssss',19,12345,Vaskerivej 1,8900,Randers,1,1.23,egenserver,prox,1.2.3.4,11:22:33:44:55:66

sql_vask_pre
INSERT INTO `m5_vaskeri` (`FK_afd_id`, `vaskeri_knr`, `vaskeri_adr`, `vaskeri_postnr`, `vaskeri_by`, `terminaltype`, `terminal_sw`, `m5hosting`, `rfid`, `wanip`, `mac`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

PHP kode
// Opret et prepared statement
if ($stmt = $mysqli->prepare($sql_vask_pre)) {

    // Bind parametre
    $stmt->bind_param($sql_vask_data);

    // Sæt værdier på parametrene
   
    // Eksekver forespørgslen
    $stmt->execute();

    // Luk statement
    $stmt->close();

FEJL:

Wrong parameter count for mysqli_stmt::bind_param() in on line 610
Fatal error: Uncaught exception 'mysqli_sql_exception' with message 'No data supplied for parameters in prepared statement' in 615
Stack trace: #0 (615): mysqli_stmt->execute() #1 {main} thrown in  on line 615

Hvis jeg tager den RÅ SQL streng og parser direkte via phpmyadmin, så kører den lige igennem.

Min hensigt med denne tilgang var, at jeg har ialt 24 felter i databasen som kan udfyldes, men det er ikke hver post der kræver info fra lle 24 felter! For at koge det ned ville jeg lade et array klare det praktiske for mig......

Særligt undre det mig at strengen virker i rå tilstand, men ikke o prepare....

Håber der er en logisk forklaring...
Avatar billede mccookie Seniormester
25. marts 2014 - 06:30 #4
Afvikles denne sætning direkte i phpmyadmin, så lægger den data ind i databasen :-)

INSERT INTO `m5_vaskeri` (`FK_afd_id`, `vaskeri_knr`, `vaskeri_adr`, `vaskeri_postnr`, `vaskeri_by`, `terminaltype`, `terminal_sw`, `m5hosting`, `rfid`, `wanip`, `mac`) VALUES ('19','12345','Vaskerivej 1','8900','Randers','1','1.23','egenserver','prox','1.2.3.4','11:22:33:44:55:66')

Men ikke i min prepare tilstand....
Avatar billede mccookie Seniormester
25. marts 2014 - 07:11 #5
Nu har jeg prøvet at koble prepare delen fra, og lade det afvikle fra scriptet.

$sql_raw = "INSERT INTO `m5_vaskeri` (`FK_afd_id`, `vaskeri_knr`, `vaskeri_adr`, `vaskeri_postnr`, `vaskeri_by`, `terminaltype`, `terminal_sw`, `m5hosting`, `rfid`, `wanip`, `mac`) VALUES ('19','12345','Vaskerivej 1','8900','Randers','1','1.23','egenserver','prox','1.2.3.4','11:22:33:44:55:66')";

mysqli_query($mysqli,$sql_raw);

Så bliver det smidt direkte i databasen uden problemer.... :o)

Men min prepare kan jeg ikke få til at virke...
Avatar billede mccookie Seniormester
25. marts 2014 - 07:14 #6
Måske denne guide forklare mit problem, det vil jeg lige afprøve:

http://www.pontikis.net/blog/dynamically-bind_param-array-mysqli
Avatar billede repox Seniormester
25. marts 2014 - 07:22 #7
Har du set kommentar #2?
Avatar billede mccookie Seniormester
25. marts 2014 - 07:30 #8
repox> Ja, men det var copy paste fejl, se øvrige kommentarer og bemærk at jeg kan parse det direkte i phpmyadmin....

Problemet skyldtes at man ikke kan lave et prepare direkte fra array data..... men har fundet nogle guides der lige skal afprøves...
Avatar billede mccookie Seniormester
25. marts 2014 - 08:54 #9
Er der nogen med erfaring i at trække data fra et array og lægge det ind via Mysqli?
Avatar billede Slettet bruger
25. marts 2014 - 09:05 #10
Det virker som en besynderlig måde at lagre en masse forskellige datatyper på.
Har du overvejet at kode objekt orienteret i stedet?

Jeg har personligt ikke arbejdet ret meget med prepared statements, men din fejl er, at den ikke modtager data til alle felter, netop som du skriver, fordi du har områder i dit array som kan være tomme.

Så du må sikre dig, at alle bind parametre indeholder noget.
Hvis der ikke er data, så send en tom streng til feltet der forventer en streng.

Sørg for at holde dine datatyper korrekte.
Avatar billede mccookie Seniormester
25. marts 2014 - 10:29 #11
Hej,

Jeg har søgt lidt rundt på nettet, og det er ikke en fejl som sådan. Som jeg læser i de forskellige fora, så skyldtes det et sikkerhedsissue. I mine arrays er der såment data, jeg kan jo outputte og køre det via phpmyadmin - Det er mine prepares der ikke virker...

Men OOP og nøden fra de andre fora må være vejen ;o)
Avatar billede arne_v Ekspert
25. marts 2014 - 18:32 #12
hmm - nu er jeg ikke PHP guru, men:

INSERT INTO `m5_vaskeri` (`FK_afd_id`, `vaskeri_knr`, `vaskeri_adr`, `vaskeri_postnr`, `vaskeri_by`, `terminaltype`, `terminal_sw`, `m5hosting`, `rfid`, `wanip`, `mac`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

har 11 parametre

saa jeg vil mene at bind_param skal kaldes med 12 argumenter (type streng + de 11 parameter vaerdier)

men:

$stmt->bind_param($sql_vask_data);

kalder kun med 1 argument.

At det ene argument indeholder 12 ting tror jeg ikke PHP kan bruge til noget.
Avatar billede arne_v Ekspert
25. marts 2014 - 18:33 #13
Du kan enten lave en mere simpel logik og bare angibe 12 argumenter *eller* gaa i gang med den gyselige call_user_func_array
Avatar billede mccookie Seniormester
25. marts 2014 - 22:32 #14
Smid et svar....

Jeg har fundet en midlertidig løsning, men vil arbejde videre med arne_vs forslag......
Avatar billede Slettet bruger
25. marts 2014 - 22:39 #15
Er en del af dette sites politik ikke, at man poster sine løsninger, midlertidige eller ej?
Avatar billede mccookie Seniormester
25. marts 2014 - 22:54 #16
Hej ssnielsen>>

Jeg tror da ikke der findes en særlig politik på dette site, som helt eller delvist, opfordre til at undlade at poste den eller de løsninger der måtte komme!

Se evt. #6, her poster jeg et link med teksten om, at det må være vejen frem! - Men jeg får det ikke til at virke!
- Hvorfor jeg springer videre i min kode og må vende tilbage når tid er.

Se dernæst #14 her henviser jeg til, at jeg vil arbejde videre med Arne_v's input - Hvilket også er min konklusion for nuværende.....

Så jeg beklager, men der er ikke noget at poste
Avatar billede mccookie Seniormester
08. april 2014 - 19:13 #17
Hej Arne_v

Jeg arbejder videre med din løsning, men vil du smide et svar..... Det må virke ved blot at sende data efterhånden som de er klar ;o)

.... Men grundet lidt tidsprioritering må det vente lidt...
Avatar billede arne_v Ekspert
09. april 2014 - 01:57 #18
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester