NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: mysqli_num_rows() expects parameter 1 to be mysqli_result

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Vladislav Domin:13.6.2016 13:40

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.6.2016 13:40
Avatar
Michal
Člen
Avatar
Michal:13.6.2016 14:31

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.6.2016 14:33
 
Nahoru Odpovědět
13.6.2016 14:31
Avatar
Snorlax
Tvůrce
Avatar
Snorlax:13.6.2016 14:46

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
13.6.2016 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.