Avatar billede apromis Praktikant
05. august 2010 - 15:57 Der er 21 kommentarer og
1 løsning

Prepared statements mysqli

Hej alle.

HAr oprettet et spørgsmål tidligere hvor jeg for anbefalet at bruge mysqli mv.

Har prøvet dette eksempel :
http://php.net/manual/en/pdo.prepared-statements.php

Men kan ikke få det til at virke.
Jeg plejer at kalde en funktion således :
    $letters = $_GET['letters'];
    $hvad = "ID,producent";
    $tabel = "produkter";
    $hvilket = "producent like '%".$letters."%' LIMIT 10"; 
    $find = sel($hvad, $tabel, $hvilket);
    while($inf = mysql_fetch_array($find)){
    echo $inf["ID"];
        }

Min funktion :
function sel($hvad, $tabel, $hvilket) {
$find_res ="1";
$find = "select " .$hvad ." from " .$tabel ." where " .$hvilket;
$find_res = mysql_query($find) or die(mysql_error()); 
return $find_res;



Men hvordan søren laver jeg den om til den nye måde der ?
Kan sku ikke se sammenhængen :(
Avatar billede majbom Novice
05. august 2010 - 18:44 #1
$hvilket = "producent like '%".$letters."%' LIMIT 10";

-->

$hvilket = "producent like '%?%' LIMIT 10";

og

$find_res = mysql_query($find) or die(mysql_error());

-->

$stmt = $din_mysqli_instans->prepare($find));
$stmt->bind_params('s', $letters);
$stmt->execute();
Avatar billede apromis Praktikant
05. august 2010 - 20:40 #2
Det vil sige mit eksempel kunne være ?


$letters = $_GET['letters'];
$hvad = "ID,producent";
$tabel = "produkter"

$find = "select ? from ?producent like '%?%' LIMIT 10";
   
$stmt = $din_mysqli_instans->prepare($find));
$stmt->bind_params('s', $hvad);
$stmt->bind_params('s', $tabel);
$stmt->bind_params('s', $letters);
$stmt->execute();

Men det virker ikke helt. Hvad skal stregen din_mysqli_instans være ? Find må være korrekt.
Og hvordan udskriver jeg så data altså denne her kode :
    while($inf = mysql_fetch_array($find)){
    echo $inf["ID"];
        }

På forhånd tak
Avatar billede apromis Praktikant
05. august 2010 - 20:41 #3
$find = "select ? from ? where producent like '%?%' LIMIT 10";

Skulle der selvfølgelige stå :)
Avatar billede majbom Novice
05. august 2010 - 20:59 #4
der er jo ingen grund til at bruge prepared statements på select og from, da de jo er skrevet i koden. det bruges normalt på variabler der kommer fra brugeren
Avatar billede apromis Praktikant
05. august 2010 - 21:08 #5
Jamen det er for jeg kan gøre det mere variabelt da jeg bruger samme kode til alle mine request.
Så du vil mene jeg skal gøre ala :


$find = "select '$hvilket' from '$tabel' where producent like '%?%' LIMIT 10";
 
$stmt = $din_mysqli_instans->prepare($find));
$stmt->bind_params('s', $letters);
$stmt->execute();

Men hvordan udskriver jeg dataen ? Både når der tale om et array og bare en enkelt post.
Er det mig som er dum ?
Avatar billede majbom Novice
05. august 2010 - 21:43 #6
while($rows=$stmt->fetch()){}
Avatar billede apromis Praktikant
05. august 2010 - 22:43 #7
Er det uanset om det array eller assoc ?
Avatar billede majbom Novice
06. august 2010 - 07:41 #8
ja, her svarer det så bare til assoc
Avatar billede majbom Novice
04. november 2010 - 14:28 #9
kom du videre?
Avatar billede apromis Praktikant
04. november 2010 - 17:22 #10
Nej på ingen måde. Den driller mig virkelig.
Du har ikke lyst til at tjene 150 bobs vel ?

På forhånd tak
Avatar billede majbom Novice
04. november 2010 - 17:43 #11
jeg bliver ikke bedre til at programmere fordi du giver mig penge ;)

lad os forstsætte hér - jeg ville bare høre om det stadig var aktuelt, inden jeg gik igang :)
Avatar billede apromis Praktikant
04. november 2010 - 17:56 #12
Meget stort sagt :).

Jeg prøver.

Pt. prøver jeg "bare" at få det til at virke uden det er i en funktion :
[code]
require "functions/mysql.php";
require "functions/sql.php";
    $letters = $_GET['letters'];
    $hvad = "ID,producent";
    $tabel = "produkter";
    $find = "producent like '%?%' LIMIT 10";
    $stmt = $din_mysqli_instans->prepare($find);
    $stmt->bind_params('s', $hvad);
    $stmt->bind_params('s', $tabel);
    $stmt->bind_params('s', $letters);
    $stmt->execute();
while($rows=$stmt->fetch()){
    echo $inf["ID"];
        }
[/code}

Dog fejler den i $stmt = $din_mysqli_instans->prepare($find);
lige nu med :
Fatal error: Call to a member function prepare() on a non-object in /home/www/styrkosten.dk/mysqli/list.php on line 9
Avatar billede majbom Novice
04. november 2010 - 19:12 #13
hvor kommer $din_mysqli_instans fra?
Avatar billede apromis Praktikant
04. november 2010 - 19:47 #14
Aha havde glemt at smide databasen på.
Koden er nu
<?
$mysqli = new mysqli('ddddd','cccc','cccc','aaaa');
    $letters = $_GET['letters'];
    $hvad = "ID,producent";
    $tabel = "produkter";
    $find = "producent like '%?%' LIMIT 10";
    $stmt = $mysqli->prepare($find);
    $stmt->bind_params('s', $hvad);
    $stmt->bind_params('s', $tabel);
    $stmt->bind_params('s', $letters);
    $stmt->execute();
while($rows=$stmt->fetch()){
    echo $inf["ID"];
        }
?>

Fejlen er :
Fatal error: Call to a member function bind_params() on a non-object in /home/www/styrkosten.dk/mysqli/list.php on line 8
Avatar billede majbom Novice
04. november 2010 - 19:54 #15
prøv lige at udskriv $mysqli->error; efter $stmt = $mysqli->prepare($find);
Avatar billede apromis Praktikant
04. november 2010 - 20:31 #16
Dette giver :
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'producent like '%?%' LIMIT 10' at line 1
Fatal error: Call to a member function bind_params() on a non-object in /home/www/styrkosten.dk/mysqli/list.php on line 9
Avatar billede apromis Praktikant
04. november 2010 - 20:36 #17
Det er noget med min sql. Har ændret denne til nu : (manglede før)


<?
$mysqli = new mysqli('ddddd','cccc','cccc','aaaa');
        $letters = $_GET['letters'];
    $hvad = "ID,producent";
    $tabel = "produkter";
    $find = "select '?' from '?' where producent like '%?%' LIMIT 10";
    $stmt = $mysqli->prepare($find);
    echo $mysqli->error;
    $stmt->bind_params('s', $hvad);
    $stmt->bind_params('s', $tabel);
    $stmt->bind_params('s', $letters);
    $stmt->execute();
while($rows=$stmt->fetch()){
    echo $inf["ID"];
        }
        echo $data ."###".$tekst ."|";
echo "1;1;1;1;1;1;1;ny###Indsaet selv data|";
?>

Jeg får fejl i linjen :
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '? where producent like '%?%' LIMIT 10' at line 1
Fatal error: Call to a member function bind_params() on a non-object in /home/www/styrkosten.dk/mysqli/list.php on line 9
Avatar billede apromis Praktikant
04. november 2010 - 20:50 #18
Der manglede where i sql, men den melder stadig samme fejl :(
Avatar billede majbom Novice
04. november 2010 - 20:54 #19
prøv med:

  $find = "select * from tabel where producent like ? LIMIT 10";

og:

  $stmt->bind_params('s', '%'.$letters.'%');

som sagt er der ingen grund til at prepare den del der er hardcoded, eller som ikke kommer fra en bruger...
Avatar billede apromis Praktikant
04. november 2010 - 21:00 #20
Det er korrekt :).

Jeg får nu fejlen :
Fatal error: Call to undefined method mysqli_stmt::bind_params() in /home/www/styrkosten.dk/mysqli/list.php on line 9

Linje 9 er
$stmt->bind_params('s', '%'.$letters.'%');



Koden ser sådan her ud :
    $stmt  = new mysqli('aaa','ccc','ccc','ddd');
    $letters = $_GET['letters'];
    $hvad = "ID,producent";
    $tabel = "produkter";
    $find = "select * from produkter where producent like ? LIMIT 10";
    $stmt = $stmt->prepare($find);
    echo $stmt->error;
    $stmt->bind_params('s', '%'.$letters.'%');
    $stmt->execute();
        while($rows=$stmt->fetch()){
        echo $inf["ID"];
        }
    echo $data ."###".$tekst ."|";
    echo "1;1;1;1;1;1;1;ny###Indsaet selv data|";
Avatar billede apromis Praktikant
19. april 2011 - 09:11 #21
JEg fandt aldrig ud af mit problem.

Vil du have points for forsøget ?
Avatar billede apromis Praktikant
09. juni 2011 - 23:22 #22
Jeg lukker jf. oventående.
Ellers skriv, så finder vi en løsning :)
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