Diskuze: mysqli_num_rows() expects parameter 1 to be mysqli_result

PHP PHP mysqli_num_rows() expects parameter 1 to be mysqli_result American English version English version

Avatar
sunspinx
Člen
Avatar
sunspinx:

Zdravim,

pred tyzdnom som zacal s PHP a neviem si rady s touto chybou... Taktiez by som sa rovno chcel spytat, ci je dany kod bezpecny (sql injection atd..) Dakujem za pomoc

Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in C:\xampp\htdoc­s\aa\registra­cia.php on line 9

Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in C:\xampp\htdoc­s\aa\registra­cia.php on line 17

<?php
require_once("__db.php");



function nickExistuje($conn, $username) {
    $sql = "SELECT COUNT(*) FROM uzivatelia WHERE uzivatel_id = ? LIMIT 1, $username";
    $result = mysqli_query($conn, $sql);
    if(mysqli_num_rows($result) > 0)
        return true;
    return false;
}

function emailExistuje($conn, $email) {
    $sql = "SELECT COUNT(*) FROM uzivatelia WHERE email = ? LIMIT 1, $email";
    $result = mysqli_query($conn, $sql);
    if(mysqli_num_rows($result) > 0)
        return true;
    return false;
}


if ($_POST) {
    $username = $_POST['usr'];
    $email = $_POST['email'];
    $heslo1 = $_POST['heslo1'];
    $heslo2 = $_POST['heslo2'];

    if ($_POST['heslo1'] != $_POST['heslo2'])
    {
        $sprava = "Hesla nesuhlasia";
    }

    else
    {
        if(nickExistuje($conn, $email))
        {
            $sprava = "Uzivatel s touto prezyvkou uz existuje, skuste inu!";
        }
        else if(emailExistuje($conn, $email))
        {
            $sprava = "Zadany email sa uz pouziva, skuste iny!";
        }
        else
        {
            $sql = "INSERT INTO uzivatelia (email, prezyvka, heslo) VALUES ('$email', '$username', '$heslo1')";
            if (mysqli_query($conn, $sql))
            {
                echo "Boli ste uspesne registrovany!";
            }
            else
            {
                echo "Error: " . $sql . "<br>" . mysqli_error($conn);
            }
        }
    }
}
?>
 
Odpovědět 13. června 13:40
Avatar
Oxtimus
Člen
Avatar
Oxtimus:

Chyba je v tom, že mysqli_query() neumí pracovat s předpřipravenými výrazy (alespoň ne ve své základní podobě). Ideální by bylo přejít na objektový přístup, ale i procedurální mysqli nabízí alternativu, zkus kouknout do manuálu na mysqli_prepare(). Pokud jde o bezpečnost, předpřipravené výrazy by tě při správném používání měly zcela ochránit před SQL injekcemi, ale bohužel SQL injekce není jediný způsob, který útočníci mohou použít.

K SQL dotazu:

"SELECT COUNT(*) FROM uzivatelia WHERE uzivatel_id = ? LIMIT 1"

Pokud bude správné připojení k databázi a tabulce, pak vrátí vždy pouze jednu položku - počet všech nalezených položek. Pokud nebude žádná nalezená položka, vrátí hodnotu 0, což ale stále bude 1 položka. Takže je pak zbytečné ověřovat, mysqli_num_rows() > 0. Funkce COUNT() je tzv. agregační funkce, tzn. přijímá jeden nebo více parametrů a vrací vždy jen jeden.

Takže stačí používat mysqli_num_rows() na dotaz, který vrátí všechny položky a ne pouze jejich počet:

"SELECT * FROM uzivatelia WHERE uzivatel_id = '$username' LIMIT 1"

nebo použít méně náročnou funkci COUNT() a poté už počet položek nepočítat:

$pocet = mysqli_fetch_array(mysqli_query($db, "SELECT COUNT(*) FROM uzivatelia "))[0];
Editováno 13. června 14:33
 
Nahoru Odpovědět 13. června 14:31
Avatar
Snorlax
Redaktor
Avatar
Snorlax:

Já bych ti doporučil PDO. Je modernější a co vím tak i bezpečnější.
viz. tahle diskuse: http://www.itnetwork.cz/…4455f52e6208

a tady snad najdeš jak na to ;)
http://www.itnetwork.cz/…ovladace-pdo
http://www.itnetwork.cz/…-a-modularne

Nahoru Odpovědět  +2 13. června 14:46
Kdo chce pochopit, pochopí. Kdo dělá že chce pochopit, může pouze dělat, že pochopil...
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.