Mysqli prepared statements - nezobrazí se výsledek – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Mysqli prepared statements - nezobrazí se výsledek – PHP – Fórum – Programujte.comMysqli prepared statements - nezobrazí se výsledek – PHP – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Wee-Hool0
Duch
12. 12. 2015   #1
-
0
-

Zdravíčko. Mám problém. Chci si zabezpečit dotaz do databáze a nějak.. to nejde :-)

$numpar = count($bindpar);	
$param1 = "";
$param2 = "";
	
for($e=0;$e<$numpar;$e++) {
	$param1 .= "s";
	$param2 .= "%" . $bindpar[$e] . "%,";
}
	
$param2 = substr($param2, 0, -1);	
$bind = "bind_param('".$param1."',".$param2.")";
	
$ppvcelkem = $mysqli->stmt_init();
echo $where;
$ppvcelkem->prepare("SELECT * FROM katalog $where");	
//$ppvcelkem->bind_param("ss",$bindpar[0],$bindpar[1]);
$ppvcelkem->$bind;
$ppvcelkem->execute();
$ppvcelkem->store_result();
	
$celkem = $ppvcelkem->num_row;

echo "TU".$celkem;

 $where a $bind se mi generuje.. v tomto případě, co mi nejde, jsou proměnné:

$where = WHERE (bezhacku LIKE ? or popis LIKE ?) AND active='1';
$bind = bind_param('ss',%telefon%,%telefon%);

Zobrazí se mi jen TU, ani 0 se nezobrazí, nic.. 

A v databázi jdou dvě položky odpovídající dotazu, pokud nepoužijï stmt, dotaz se vypíše.. 

Tak kde udělali soudruzi z NDR chybu??

Předem děkuji za odpověďi..

Nahlásit jako SPAM
IP: 46.167.243.–
Kit+15
Guru
12. 12. 2015   #2
-
0
-

#1 Wee-Hool
Soudruzi udělali chybu v tom, že to překombinovali. Například nad tím cyklem jsem přemýšlel docela dlouho a stále mi nebylo jasné, k čemu to má sloužit. Proměnná $bind nedává vůbec žádný smysl. Navíc popírá veškeré zabezpečení, kterého jsi jistě chtěl dosáhnout.

Jestli ti mohu poradit, tak místo $e, které se používá spíš k obsluze výjimek, raději používej $i, $j, $k. I když zde není žádný cyklus potřebný...

To volání funkce substr() vypadá také kouzelně.

Než budeme pokračovat dál, tak ti navrhuji přejít od MySQLi k univerzálnějšímu PDO, ve kterém se prepared statements dělají přece jen o dost jednodušeji - dá se to zkrátit na polovinu. K MySQLi se mi už nechce vracet.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Wee-Hool0
Duch
12. 12. 2015   #3
-
0
-

Změnil sem jeden řádek:

$ppvcelkem->bind_param("ss",$bindpar[0],$bindpar[1]);

a dostal jsem chybu!!

mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in prepared statement

Ale mám dva variables i dva parametres, tak co to po mně chce??

Nahlásit jako SPAM
IP: 46.167.243.–
Kit+15
Guru
12. 12. 2015   #4
-
0
-

#3 Wee-Hool
Vidím jen jeden parametr. String "ss" se nepočítá.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Wee-Hool0
Duch
12. 12. 2015   #5
-
0
-

#4 Kit
Tak $bindpar[0] a $bindpar[1]

jako v tomhle případě jsou stejné, ale v případech, kdy vyhledávaný výraz obsahuje diakritiku, je jeden bez ní..

telefon je bez háčků a čárek, tak proto je to stejné, ale to snad nevadí, ne?? když to mám rozdělený do dvou proměnných..

Nahlásit jako SPAM
IP: 46.167.243.–
Kit+15
Guru
12. 12. 2015   #6
-
0
-

#5 Wee-Hool
Máš je slepené do jednoho stringu, takže jeden parametr.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Wee-Hool0
Duch
12. 12. 2015   #7
-
0
-

#6 Kit
Bohužel nevím, jak to myslíš..

Nahlásit jako SPAM
IP: 46.167.243.–
Kit+15
Guru
12. 12. 2015   #8
-
0
-

#7 Wee-Hool
Operátor .= uvnitř cyklu dělá zřetězení...

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Wee-Hool0
Duch
12. 12. 2015   #9
-
0
-

#8 Kit
No jasný a proto sem pak použil místo

$ppvcelkem->$bind;

tak

$ppvcelkem->bind_param("ss",$bindpar[0],$bindpar[1]);

a při tomhle mi to hodí tu chybu.. při tom prvním to neudělá nic

Nahlásit jako SPAM
IP: 46.167.243.–
Kit+15
Guru
13. 12. 2015   #10
-
0
-

#9 Wee-Hool
Tak si ještě přepočítej otazníky. Něco máš určitě jinak.

Doporučuji ti, aby ses trochu zamyslel nad tvorbou názvů proměnných. Tyhle jsou tak zavádějící, že mám problém se v tom vyznat.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:2cc9:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Kit+15
Guru
13. 12. 2015   #11
-
0
-

#9 Wee-Hool
Mně ten řádek 

$ppvcelkem->bind_param("ss", $bindpar[0], $bindpar[1]);

normálně funguje a na konci mi to vyplivne string "TU2" (vložil jsem 2 cvičné záznamy). Něco musíš mít jinak.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Wee-Hool0
Duch
13. 12. 2015   #12
-
0
-

   

$prvni = "%telefon%";
$druhy = "%telefon%";			
	
$ppvcelkem = $mysqli->stmt_init();
	
$where = "WHERE (bezhacku LIKE '?' or popis LIKE '?') AND active='1'";
$sql = "SELECT * FROM katalog " . $where;	
	
$ppvcelkem->prepare($sql) or die($mysqli->connect_error);	
$ppvcelkem->bind_param("ss", $prvni, $druhy);		
$ppvcelkem->execute();				
$ppvcelkem->store_result();
	
$celkem = $ppvcelkem->num_rows;
	
echo "Celkem: " . $celkem;
$ppvcelkem->free_result();	
$ppvcelkem->close();

Výstup:
 

Warning
: mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in prepared statement in
/usr/share/www/vypis.php
on line
73

Celkem: 0
Nahlásit jako SPAM
IP: 46.167.243.–
Řešení
Wee-Hool0
Duch
13. 12. 2015   #13
-
0
-
Vyřešeno Nejlepší odpověď

#12 Wee-Hool
Tak řešení je tak prosté.. BEZ ZNAKŮ ' 

$prvni = "%telefon%";
$druhy = "%telefon%";			
	
$ppvcelkem = $mysqli->stmt_init();
	
$where = "WHERE (bezhacku LIKE ? or popis LIKE ?) AND active=1";
$sql = "SELECT * FROM katalog " . $where;	
	
$ppvcelkem->prepare($sql) or die($mysqli->connect_error);	
$ppvcelkem->bind_param("ss", $prvni, $druhy);		
$ppvcelkem->execute();				
$ppvcelkem->store_result();
	
$celkem = $ppvcelkem->num_rows;
	
echo "Celkem: " . $celkem;
$ppvcelkem->free_result();	
$ppvcelkem->close();
Nahlásit jako SPAM
IP: 46.167.243.–
Kit+15
Guru
13. 12. 2015   #14
-
0
-

#13 Wee-Hool
Tys tam měl nacpané apostrofy? Tím se to vysvětluje.

K čemu tam máš to die()? To aby ti skript chcípnul?

V PDO bys mohl mít i proměnný počet parametrů a obešel by ses i bez metody bind_param().

Metoda stmt_init() je zcela zbytečná.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Wee-Hool0
Duch
13. 12. 2015   #15
-
0
-

Tak neházelo mi to žádnou chybu prvně, tak sem zkusil to or die().. Já 'sem elektrikář, víš.. Měl sem stránky naprogramovaný klasicky v mysql, pak sem se dozvěděl o sql injection, tak sem googlil a narazil na mysqli stmt a  tak se učím dále :-) A dnes sem se naučil, že v prepare dotazu nesměj bejt apostrofy

Nahlásit jako SPAM
IP: 46.167.243.–
Kit+15
Guru
13. 12. 2015   #16
-
0
-

#15 Wee-Hool
V prepare mohou být apostrofy. Jen nepatří kolem zástupných znaků (otazníků) ani kolem čísel (obecně). Apostrofy v SQL slouží pro zápis řetězcových literálů (stringů), ale také kolem zápisu data a času.

Do toho PDO tě tlačím proto, že sám jsem ovladač MySQLi přeskočil. Považuji ho za mezikrok. PDO totiž umí pracovat i s dalšími databázemi, např. PostgreSQL, SQLite, MSSQL, Firebird apod. Ovládání takových databází je pak více či méně stejné, nemusíš se u nich učit nové příkazy. Prepared statements umí PDO také a troufám si tvrdit, že to umí ještě lépe.

Elektrikář i skladník ve šroubárně si mohou přečíst originál od Vergilia :)

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 44 hostů

Podobná vlákna

MySQLi a prepared statements — založil Kuboslav

Prepared statements — založil Stormy Weather

Nezobrazí se CSS — založil Faty

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý