Autor Zpráva
Verona
Profil *
Ahoj,
mám napsanou funkci, před kterou volám connection :
$jmeno_db = "";
$heslo_db = "";
$server_db = "";
$spojeni_db = mysqli_connect($server_db, $jmeno_db, $heslo_db);
 header ("Content-Type: text/html; charset=UTF-8");
  function sqlInj($hodnota) {
  
  $hodnota=strip_tags($hodnota);
  $hodnota=str_replace("'", "'", $hodnota);     //nahrada jednoduchych uvozovek za zkratku
  $hodnota=str_replace('"', """, $hodnota);     //nahrada dvojtych uvozovek za zkratku
  $hodnota=addslashes($hodnota);                    //prida zpetna lomitka pred dvojte uvozovky
  $hodnota=mysqli_real_escape_string($spojeni_db, $hodnota);        //escapuje speciální znaky řetězce unescaped_string, s ohledem na kódování spojení, a to tak, že výsledek můžete bezpečně použít v SQL příkazu s funkci mysql_query()
  return $hodnota;
}
No a když pak funkci použiju například zde:
$login=sqlInj($_POST['login']); /* nick zadaný ve formuláři pro přihlašování */
mám chybu:
Warning: mysqli_real_escape_string() expects parameter 1 to be mysqli, null given in C:\wamp64\www\papi\config\fce.inc.php

Vím co chyba znamená ale není mi jasné proč tam je, když do funkce mysqli_real_escape_string() předávám jak spojení, tak řetězec?

Děkuji za vysvětlení
T-fon
Profil
Ta funkce proměnnou $spojeni_db nevidí.
Verona
Profil *
Jak to že jí nevidí, když jí před voláním funkce incuduji?


A když funkci zapíši starším zápisem tak to hodí tyty chyby:
function sqlInj($hodnota) {
  
  $hodnota=strip_tags($hodnota);
  $hodnota=str_replace("'", "'", $hodnota);     //nahrada jednoduchych uvozovek za zkratku
  $hodnota=str_replace('"', """, $hodnota);     //nahrada dvojtych uvozovek za zkratku
  $hodnota=addslashes($hodnota);                    //prida zpetna lomitka pred dvojte uvozovky
  $hodnota=mysql_real_escape_string($hodnota);        //escapuje speciální znaky řetězce unescaped_string, s ohledem na kódování spojení, a to tak, že výsledek můžete bezpečně použít v SQL příkazu s funkci mysql_query()
  return $hodnota;
}

Warning: mysql_real_escape_string(): Access denied for user ''@'localhost' (using password: NO)
Warning: mysql_real_escape_string(): A link to the server could not be established
T-fon
Profil
Musíte tu proměnnou předat:
$login=sqlInj($spojeni_db, $_POST['login']);
function sqlInj($spojeni, $hodnota) {
...
$hodnota=mysqli_real_escape_string($spojeni, $hodnota);
Tomášeek
Profil
Verona:
Základ PHP a viditelnost proměnných. Vnější proměnné nejsou vidět uvnitř funkce, pokud jí nejsou předány parametrem a naopak, proměnné z vnitřku funkce nejsou viditelné okolnímu kódu.

Upozorním, že všechny úpravy před uložením do databáze jsou zbytečné a výrazně doporučuji je neprovádět - vyjma právě escape_string. Ukládej je včetně HTML, nikdy nevíš, kdy ho budeš později potřebovat (pokud to jsou třeba nějaké komentáře, můžeš v budoucnu dohledat, kdo se snažil propašovat HTML a jaké, zda škodlivé, spamové, jakékoliv). strip_tags a eventuálně htmlspecialchars (místo náhrady uvozovek za entity a addslashes) použij až při výpisu.
WordpressKokos
Profil
Tomášeek Zajímavý názor
Verona
Profil *
Děkuji všem za rady a když mám funkci ve funkci, kde mám již upravenou tu první funkci sqlInj, která samostatně funguje, myslela jsem že bude fungovat i zde, ale není tomu tak, a je opět chyba:
Warning: mysqli_real_escape_string() expects parameter 1 to be mysqli, null given in
Musím tedy to spojení rovněž přidat do té nadřazené funkce?

function ident($ident, $db, $stid) {
$ident=sqlInj($spojeni_db, $ident);
 $prevodni_tabulka = Array(
  'ä'=>'a',
  'Ä'=>'A',
  ---
  --
  --



Aha tak vidím že ano, zkusila jsem toto a funguje, je to správně:
function ident($spojeni, $ident, $db, $stid) {
$ident=sqlInj($spojeni, $ident);
 $prevodni_tabulka = Array(
M4n
Profil *
Doporučil bych ti (včas) opustit globální funkce a přejít rovnou k objektům, protože to, oč se tady snažíš zanořováním funkcí, řeší právě objekty.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: