PHP error warning mysql_num_rows() expects parameter 1 to be resource, boolean given

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Web Ontwikkelaar PHP, Nijmegen

Contactpersoon Roel Kavelaar rkavelaarATsearch-consult.nl 0243528815 0644949337 Organisatie Jong, gezond en sterk groeiende bedrijf dat webbased multimedia oplossingen bouwt in de omgeving Nijmegen. Het bedrijf bouwt voor klanten o.a. geavanceerde websites, webwinkels, webapplicaties en specifieke webbased software. Het bedrijf ontwikkelt en onderhoudt ook verschillende bekende Nederlandse websites. Op dit moment hebben zij een groeiende en brede klantenkring opgebouwd. Met betrekking tot programmeer-, onderhoud-, ontwerp-werkzaamheden wordt een PHP ontwikkelaar gezocht met kennis van contentmanagementsysteemen en frameworks. Locatie Nijmegen Verantwoordelijkheden (Her)Ontwerpen en (her)ontwikkelen in PHP ten behoeve van websites voor klanten, project klussen, onderhoud en specifieke klantwensen (Her)Ontwerpen en (her)ontwikkelen in PHP, PHP

Bekijk vacature »

Frank van Hassel

Frank van Hassel

08/03/2018 16:41:36
Quote Anchor link
Beste leden van phphulp,

Wanneer ik probeer in te loggen kom ik deze php warning tegen:

Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\newphp\Pizza\LoginHotel.php on line 61
Wachtwoorden komen niet overeen!

Ik snap alleen niet wat er verkeerd is in de code.
Ik hoop dat iemand mij kan helpen.

Mvg Frank

Toevoeging op 08/03/2018 16:44:10:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
<!DOCTYPE html>
<?php
session_start();
include("stylesheet.css");
?>


<html>
<center>
    <head>
        <h1>Pizza en Hotel</h1><hr>
    </head>
    <body>
    <form method="POST">
    <h2>Login</h2>
        <table>
            <tr><td>Gebruikersnaam:</td><td><input type="text" name="txtNaam"></td></tr>
            <tr><td>Wachtwoord:</td><td><input type="password" name="txtWachtwoord"></td></tr>
            <tr><td></td><td><input type="submit" value="Log in" name="btnLogin"></td></tr>
        </table>    
        <hr>                        
            <h2>Registreren</h2>
            <table>
                <tr>
                    <td>Gebruikersnaam:</td>
                    <td><input type="text" name="txtUsername"></td>
                </tr>
                <tr>
                    <td>Wachtwoord:</td>
                    <td><input type="password" name="txtWachtwoord1"></td>
                </tr>
                <tr>
                    <td>Bevestig wachtwoord:</td>
                    <td><input type="password" name="txtWachtwoord2"></td>
                </tr>
                <tr>
                    <td></td>
                    <td><input type="submit" value="Bevestig" name="btnConfirm"/>
                </tr>
            </table>
        </form>
        <h2>
        <hr>
        <?php
            include('loginDB.php');
            if(isset($_POST['btnLogin']))
            {

                $username = $_POST['txtNaam'];
                $password = $_POST['txtWachtwoord'];
                
                if($username && $password)
                {

                    $connect = mysql_connect('localhost', 'root', '') or die ('Could not Connect');
                    mysql_select_db("pizzahotel") or die ("could not find the database!");
                    
                    $query = sprintf("SELECT id, gebruikersnaam, wachtwoord FROM login WHERE `gebruikersnaam`='%s' AND `wachtwoord`='%s'",
                    mysql_real_escape_string($username),
                    mysql_real_escape_string($password));
                    
                    $rows = mysql_query($query);
                    
                    $numrows = mysql_num_rows($rows);
                    
                    if($numrows)
                    {

                        while($row = mysql_fetch_assoc($rows))
                        {

                            $dbusername = $row['gebruikersnaam'];
                            $dbpassword = $row['wachtwoord'];
                            $dbid = $row['id'];
                            $_SESSION["username"]=$dbusername;
                            $_SESSION["dbid"]=$dbid;
                        }

                        
                        echo("Welcome terug $dbusername ! ");
                        
                        $_SESSION["logint"] = 1;
                        echo("</br><a href='Hotel.php'>Door naar Hotel. </a>");
                        echo("</br><a href='Pizza.php'>Door naar Pizza. </a>");
                        if($dbusername=="Admin" && $dbpassword=="admin")
                        {

                            header('Location: //localhost/newphp/Pizza/Overzicht.php');
                        }
                        
                        
                    }

                    else die("Wachtwoorden komen niet overeen!");
                }
            }

            if(isset($_POST['btnConfirm']))
            {

                $gebruiker = $_POST['txtUsername'];
                $wachtwoord = $_POST['txtWachtwoord1'];
                $wachtwoordherhaal = $_POST['txtWachtwoord2'];
        
                if($wachtwoord == $wachtwoordherhaal)
                {

                    $query = "INSERT INTO login VALUES (0, '$gebruiker', '$wachtwoord')";
                    mysqli_query($db, $query);
                    echo "Registreren Voltooid!";
                }
else
                {
                    echo "Wachtwoorden komen niet overeen!";
                }
            }

        ?>
        
        </h2>
    </body>
</center>
</html>


CSS:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<style>
body {
    background-image:url("http://cdn.pcwallart.com/images/dark-abstract-1920x1080-wallpaper-2.jpg");
    background-repeat: no-repeat;
    background-attachment: fixed;
    color: white;
}
</style>


db CONNECTIE
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<?php
    //Databasenaam
    $dbnaam = "pizzahotel";
    //De server waarop de service MySQL draait
    $host = "localhost";
    //Gebruikersnaam waarmee ingelogd kan worden op de MySQL Database
    $user = "root";
    //Het wachtwoord voor de gebruiker die in wil loggen op de data
    $passwd = "";
    
    $db = mysqli_connect($host, $user, $passwd, $dbnaam) or die("Kan geen verbinding maken met de database!");
    
?>
Gewijzigd op 08/03/2018 17:19:53 door - Ariën -
 
PHP hulp

PHP hulp

25/04/2019 11:04:07
Honeypot
 
- Ariën -
Beheerder

- Ariën -

08/03/2018 17:19:21
Quote Anchor link
Ik heb even code-tags om de elen van je script gezet. Zie ook de Vele gestelde vragen met uitleg van de bestanade UBB opmaakcodes die je in het vervolg kan gebruiken.

Om terug te komen op je probleem:
Je $query geeft niet de juiste waarde (een resource) terug. De beste oplossing is om goede foutafhandeling toe te voegen. Je SQL-opdracht bevat ergens een fout, en dus kan deze niet uitgevoerd worden., waardoor mysql_num_rows() er ook niks mee kan.

Als je verder wilt gaan, dan raad ik aan om meteen over te stappen naar de functie-bibliotheek van MySQLi, want in PHP 7 (die al veel gebruikt wordt!) zijn de huidige mysql_***() functies al verwijderd. Dus mocht je dit script straks uitrollen op je webhosting, die vervolgens besluit om PHP7 te gebruiken, dan zal je script meteen stoppen met werken.

Verder heb ik nog wat opmerkingen:
- session_start(); hoort uiterst bovenaan te staan. Hier mag geen zichtbare witregel of HTML voor staan

- Waarom sla je wachtwoorden niet geëncrypt op? Hiervoor kan je prima password_hash en password_verify voor gebruiken. In deze tijd waar veiligheid voorop staat kan je het niet permitteren om wachtwoorden open en bloot op te slaan!!!

- Gebruik foutafhandeling, en kijk bij elke query die je uitvoert of deze false teruggeeft of de juiste resource. Als deze onverhoopt niet werkt, dan dien is slim om een foutmelding te tonen. Bij voorkeur een niet zo technische melding die aangeeft dat er 'iets mis is op je site', op de achtergrond log je de complete foutmelding uit mysqli_error($conn) en stuur je een mailtje naar jou zelf of een andere vorm van notificatie.

- Op lijn 79 is het niet verstandig om inloggegevens hardcoded op te slaan. Ik neem aan dat ook admins deze graag regelmatig willen wijzigen zonder in hun code te graven.

- Gebruik geen die() in je code, want er zijn geen enkele redenen dat je script ook echt met de uitvoer moet stoppen. Zeg dan liever: 'stop met de huidige actie, en voer de rest uit.'. Jij loopt immers toch ook niet zomaar weg bij een gesprek met iemand als je een "Nee" krijgt?

- De structuur van je HTML-document klopt ook niet helemaal. Boven je <html>-tag lijk je een stylesheet in te voegen, die binnen de head-sectie hoort, die op zijn beurt weer in je HTML-sectie hoort. Ook de <center> tag staat op de verkeerde plek, en hoor in de body, maar <center> is sowieso al een oude tag die je eigenlijk niet meer moet gebruiken, en jouw site beter moet laten centreren via CSS. ;-)

- Structureer je code, en plaats alle acties die je in PHP gaat uitvoeren vóórdat je de HTML gaat weergeven. Zo blijft je code leesbaar, logisch en overzichtelijk.

Met andere woorden: Er is nog een hoop werk voordat je script goed en betrouwbaar zal zijn.
Veel succes en als je vragen hebt, laat die gerust weten.
Gewijzigd op 08/03/2018 17:38:10 door - Ariën -
 
Thomas van den Heuvel

Thomas van den Heuvel

08/03/2018 17:48:59
Quote Anchor link
Ik zou je ook aanraden om jezelf te trainen foutmeldingen te leren lezen. Hier zit een schat van informatie in en daarmee kun je uiteindelijk ook je eigen code debuggen, wat je weer helpt om (beter) te leren programmeren.

Laten we de fout eens analyseren:
Quote:
Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\newphp\Pizza\LoginHotel.php on line 61

Allereerst dus de realisatie dat er iets fout ging met mysql_num_rows. Pakken we even de documentatie erbij: deze functie verwacht één parameter die van het type resource dient te zijn. Zoveel zegt de foutmelding ook: expects parameter 1 to be resource. Maar dit is niet wat deze functie als waarde ontving, immers, deze ontving een boolse waarde (boolean given). Okay, dus $rows bevat een boolean (true of false) en niet een resource. mysql_query() gaf dus blijkbaar een boolean terug. Omdat dit een SELECT-query betrof, was dit waarschijnlijk false. Pakken we de documentatie er weer bij en kijken we in de rubriek Return Values. Hier staat:
Quote:
For SELECT, SHOW, DESCRIBE, EXPLAIN and other statements returning resultset, mysql_query() returns a resource on success, or FALSE on error.
...
mysql_query() will also fail and return FALSE if the user does not have permission to access the table(s) referenced by the query.

Voorlopige conclusie: de query is syntactisch (dus qua vorm) incorrect. Tijd om deze eens te debuggen? Je hebt overal "or die" staan, dus voeg eens "or die(mysql_error())" toe achter mysql_query() om te zien wat er aan de hand is of dump $query eens naar het scherm. De huidige programmeerwijze is niet echt bedoeld voor een productieomgeving natuurlijk, maar volstaat voor ontwikkeling.

Tijd om aan het werk te gaan met je foutmelding. Daarbij zou ik ook bovenstaande opmerkingen van @Ariën in acht nemen. De originele MySQL-driver (in wezen alle mysql_* functies) is al ongever 10+ jaar verouderd, dus mijn advies zou ook zijn dat je direct overstapt op MySQLi of PDO.

EDIT: ook wil ik nogmaals benadrukken dat de foutmelding je precies vertelt wat er aan je code mankeert en legt direct de vinger op de zere plek. In feite is er dus geen enkel excuus dat je dit niet zelf zou moeten kunnen oplossen. Ik snap dat dit een leerproces is, maar het meeste kun je leren van fouten, deze dwingen je namelijk om in de materie te duiken en stap voor stap na te gaan wat er precies gebeurt. Dit helpt je echt met de begripsvorming en ben je niet reddeloos verloren als je eens een keer van het gebaande pad afraakt.
Gewijzigd op 08/03/2018 17:53:19 door Thomas van den Heuvel
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.