UltraB Δημοσιεύτηκε Αύγουστος 29, 2015 #1 Κοινοποίηση Δημοσιεύτηκε Αύγουστος 29, 2015 Καλησπέρα παιδιά, προσπαθώ να φτιάξω στο παρακάτω κώδικα το σημείο από την σειρά 52 έως την 57. Προφανώς δεν έκανα κάτι καλά στην μετατροπή από PDO σε MySQLi αλλά ότι και αν έχω προσπαθήσει δε μπορώ να βγάλω άκρη. Απ όσο έχω καταλάβει δε πρέπει να παίρνω αποτέλεσμα false / boolean (βλέπε var_dump($query); ). bool(false)Fatal error: Call to a member function execute() on boolean in C:\xampp\htdocs\xxxxxx\php\register.php on line 56 <?phprequire_once 'database.php'; Consider mysqli in your database.php like below$mysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); $Username = $_POST['username']; #Username $Password = $_POST['password']; #Password $Password2 = $_POST['password2'];#Passwordif(empty($Password2)){ echo "Please enter a valid confirmation password."; $msg .=" Please enter a valid confirmation password."; echo "<script> alert('$msg'); window.location.href='../register.html'; </script>"; exit;} if($Password !== $Password2){ echo "Sorry, passwords do not match!"; $msgPass = "Sorry, passwords do not match!"; echo "<script> alert('$msgPass'); window.location.href='../register.html'; </script>"; exit;}function NewUser(){ global $Username,$Password,$mysqli; #Egxwrish stoixeiwn $hashed_pass = PASSWORD_HASH($Password, PASSWORD_DEFAULT); $query = "INSERT INTO users (username,password) VALUES (:username, :password)"; $data = $mysqli->prepare($query); $data->execute(array(':username'=>$Username, ':password'=>$hashed_pass)); if($data->rowCount() > 0) { return "Your registration is completed!"; }}function SignUp(){ global $Username,$Password,$mysqli; if(!empty($Username)) //checking the 'username' name which is from register.html, if is it empty or have some text { $query = ("SELECT * FROM users WHERE username = :username"); $query = $mysqli->prepare($query); var_dump($query); $query->execute(array(':username'=>$Username)); if($query->rowCount() == 0) { $msg = NewUser(); echo $msg; } else { echo "Sorry, you are already registered!"; die(); } }}if(isset($_POST['submit'])){ //User registration SignUp(); echo "Your account has been created successfully. \\n Thank you for joined us!"; $msgSuccess = "Your account has been created successfully. \\n Thank you for joined us!"; echo "<script> alert('$msgSuccess'); window.location.href='../index.php'; </script>";}else echo "Sorry, sumbit button is not set";?> Τέλος είμαι νέος (aka noob) στην PHP, οπότε όποια λαθάκια στο κώδικα, συγχωρέστε τα, και όποιες προτάσεις για αλλαγή, ευπρόσδεκτες 1 Link to comment Share on other sites More sharing options...
PetrosD Αύγουστος 29, 2015 #2 Κοινοποίηση Αύγουστος 29, 2015 Στη γραμμή 72 και 73 το σωστό είναι "Thank you for joining us" Για το άλλο, δεν έχω ιδέα, sorry. Link to comment Share on other sites More sharing options...
UltraB Αύγουστος 29, 2015 Author #3 Κοινοποίηση Αύγουστος 29, 2015 Στη γραμμή 72 και 73 το σωστό είναι "Thank you for joining us" Για το άλλο, δεν έχω ιδέα, sorry.Χαχαχα, δε παλεύεσαι ρε συ! Link to comment Share on other sites More sharing options...
PetrosD Αύγουστος 29, 2015 #4 Κοινοποίηση Αύγουστος 29, 2015 Sorry, δεν μπορώ να το ελέγξω, χαχα. 1 Link to comment Share on other sites More sharing options...
UltraB Αύγουστος 30, 2015 Author #5 Κοινοποίηση Αύγουστος 30, 2015 @nucleus, Link to comment Share on other sites More sharing options...
UltraB Αύγουστος 31, 2015 Author #6 Κοινοποίηση Αύγουστος 31, 2015 Που είσαι nucleus;! Άντε γιατί δε βλέπω φως στον ορίζοντα Link to comment Share on other sites More sharing options...
nucleus Σεπτέμβριος 1, 2015 #7 Κοινοποίηση Σεπτέμβριος 1, 2015 (edited) Αν και έχω χρόνια να γράψω php πέρα από το manual δεν έχω να προτείνω κάτι http://php.net/manual/en/mysqli.prepare.phphttp://php.net/manual/en/mysqli-stmt.execute.php Δοκίμασε το παρακάτω$query = ("SELECT * FROM users WHERE username = :username");$query = $mysqli->prepare($query); var_dump($query);$query->execute(array(':username'=>$Username));να γίνει$query = ("SELECT * FROM users WHERE username = ?");$query = $mysqli->prepare($query); $query->bind_param("s", $Username);$query->execute();Δοκίμασες να βγάλεις το var_dump τελείως ή να το βάλεις μέτα το execute? Btw δεν ήρθε καμμία ειδοποίηση από τα mentions. Έγινε επεξεργασία Σεπτέμβριος 1, 2015 από nucleus Link to comment Share on other sites More sharing options...
UltraB Σεπτέμβριος 1, 2015 Author #8 Κοινοποίηση Σεπτέμβριος 1, 2015 Τώρα μου πετάει "Fatal error: Call to undefined method mysqli_stmt::rowCount() in C:\xampp\htdocs\admin\php\register.phpon line 57"Απ ότι κατάλαβα παίρνω σαν αποτέλεσμα false, και γι αυτό δε προχωράει παρακάτω. Μπορώ να χρησιμοποιήσω PDO μόνο σε αυτό το αρχείο;Βασικά φυσικά και μπορώ αλλά πως θα κάνω την σύνδεση με τη βάση; Θα πρέπει να χρησιμοποιήσω το παρακάτω μέσα στο αρχείο εφόσον το db connection file είναι σε MySQLi.$pdo = new PDO('mysql:dbhost=host;dbname=dbname', 'dbuser', 'password'); // Provide your own credentialsΑλλά αν βάλω την παραπάνω γραμμή μέσα στο αρχείο register, δεν δημιουργεί πρόβλημα στην ασφάλεια μετά; Link to comment Share on other sites More sharing options...
nucleus Σεπτέμβριος 1, 2015 #9 Κοινοποίηση Σεπτέμβριος 1, 2015 Ολόκληρος ο κώδικας από το παράδειγμα της prepare στην σελίδα του manual της php<?php$mysqli = new mysqli("localhost", "my_user", "my_password", "world");/* check connection */if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit();}$city = "Amersfoort";/* create a prepared statement */if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) { /* bind parameters for markers */ $stmt->bind_param("s", $city); /* execute query */ $stmt->execute(); /* bind result variables */ $stmt->bind_result($district); /* fetch value */ $stmt->fetch(); printf("%s is in district %s\n", $city, $district); /* close statement */ $stmt->close();}/* close connection */$mysqli->close();?>Δες μια το παραπάνω. Σου πετάει fatal error επειδή το παρακάτωif($query->rowCount() == 0)δεν ισχύει για τα prepared statements και την mysqli. To αντίστοιχο του παραπάνω βρίσκεται εδώ http://php.net/manual/en/mysqli-result.num-rows.php Δες το παράδειγμα στην πιο πάνω σελίδα. Για php και security δεν μπορώ να σε βοηθήσω. Link to comment Share on other sites More sharing options...
UltraB Σεπτέμβριος 1, 2015 Author #10 Κοινοποίηση Σεπτέμβριος 1, 2015 Κατάφερα και το προχώρησα λίγο και τώρα μου πετάει σφάλμα:Fatal error: Call to a member function bind_param() on boolean in C:\xampp\htdocs\xxxxxx\php\register.php on line 40<?phprequire_once("database.php");$mysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); $Username = $_POST['username']; #Username $Password = $_POST['password']; #Password $Password2 = $_POST['password2'];#Password if(empty($Password2)){ echo "Please enter a valid confirmation password."; $msg .=" Please enter a valid confirmation password."; echo "<script> alert('$msg'); window.location.href='../register.html'; </script>"; exit;} if($Password !== $Password2){ echo "Sorry, passwords do not match!"; $msgPass = "Sorry, passwords do not match!"; echo "<script> alert('$msgPass'); window.location.href='../register.html'; </script>"; exit;} function NewUser(){ global $Username,$Password,$mysqli; #Egxwrish stoixeiwn $hashed_pass = PASSWORD_HASH($Password, PASSWORD_DEFAULT); $data = "INSERT * INTO users (username,password) VALUES ( ?, ?)"; $data = $mysqli->prepare($data); $data->bind_param("ss", $Username,$hashed_pass); $data->execute(); if($data->num_rows() > 0) { return "Your registration is completed!"; }} function SignUp(){ global $Username,$Password,$mysqli; if(!empty($Username)) //checking the 'username' name which is from register.html, if is it empty or have some text { $query = ("SELECT * FROM users WHERE username = ?"); $query = $mysqli->prepare($query); $query->bind_param("s", $Username); $query->execute(); if($query->num_rows() == 0) { $msg = NewUser(); echo $msg; } else { echo "Sorry, you are already registered!"; die(); } }} if(isset($_POST['submit'])){ //User registration SignUp(); echo "Your account has been created successfully. \\n Thank you for joined us!"; $msgSuccess = "Your account has been created successfully. \\n Thank you for joined us!"; echo "<script> alert('$msgSuccess'); window.location.href='../index.php'; </script>"; }else echo "Sorry, sumbit button is not set";?> Link to comment Share on other sites More sharing options...
nucleus Σεπτέμβριος 1, 2015 #11 Κοινοποίηση Σεπτέμβριος 1, 2015 ΚαταρχήνINSERT * INTO users (username,password) VALUES ( ?, ?)αυτό είναι σωστό sql statement? H απάντηση εδώ http://www.w3schools.com/sql/sql_insert.asp Έστω ότι είναι..... ας δούμε το παρακάτω$data = "INSERT * INTO users (username,password) VALUES ( ?, ?)";$data = $mysqli->prepare($data);Αυτό σίγουρα παίζει σωστά στην php? Μήπως πρέπει να το κάνεις κάπως έτσι?$commandText = "INSERT * INTO users (username,password) VALUES ( ?, ?)";$data = $mysqli->prepare(commandText); Link to comment Share on other sites More sharing options...
UltraB Σεπτέμβριος 1, 2015 Author #12 Κοινοποίηση Σεπτέμβριος 1, 2015 Καταρχήν INSERT * INTO users (username,password) VALUES ( ?, ?) αυτό είναι σωστό sql statement? H απάντηση εδώ http://www.w3schools.com/sql/sql_insert.asp Έστω ότι είναι..... ας δούμε το παρακάτω $data = "INSERT * INTO users (username,password) VALUES ( ?, ?)";$data = $mysqli->prepare($data); Αυτό σίγουρα παίζει σωστά στην php? Μήπως πρέπει να το κάνεις κάπως έτσι? $commandText = "INSERT * INTO users (username,password) VALUES ( ?, ?)";$data = $mysqli->prepare(commandText); Σωστός όσο αφορά το insert, είχα δοκιμάσει ένα σωρό τρόπους μήπως έφταιγε αυτό και έπεσες στην αντιγραφή του select με τις παρενθέσεις που το διαμόρφωνα σε insert. Προφανώς και είναι τελείως λάθος. Απλά επειδή μπορείς να το γράψεις με ένα σωρό τρόπους, έπαιζα να δω μπας και έτρωγε πουθενά σκάλωμα, αλλά δεν :/ Δυστυχώς αυτά παθαίνεις όταν δε ξέρεις PHP και στο τέλος καταλήγεις να την γράφεις πάλι εσύ... Τέλος πάντων, δοκιμάζω αυτό που μου είπες και επανέρχομαι Όπως το περίμενα, καμία διαφορά. Αν έφταιγε αυτό δε θα μου πετούσε σφάλμα και στις σειρές 53-56; Link to comment Share on other sites More sharing options...
nucleus Σεπτέμβριος 1, 2015 #13 Κοινοποίηση Σεπτέμβριος 1, 2015 (edited) Αν το sql statement είναι λάθος συντακτικά η prepare επιστρέφει false. Ίσως να πρέπει να το δεις εκεί. Από το stack overflowif($query = $mysqli->prepare($sql)) { // assuming $mysqli is the connection $query->bind_param('s', $definition); $query->execute(); // any additional code you need would go here.} else { $error = $mysqli->errno . ' ' . $mysqli->error; echo $error; // 1054 Unknown column 'foo' in 'field list'}Δες το else. Αν συνεχίζει να σκάει δοκίμασε να βάλεις μονά quotes στην bind_param$data->bind_param('ss', $Username,$hashed_pass); Έγινε επεξεργασία Σεπτέμβριος 1, 2015 από nucleus Link to comment Share on other sites More sharing options...
UltraB Σεπτέμβριος 1, 2015 Author #14 Κοινοποίηση Σεπτέμβριος 1, 2015 Λοιπόν, τα έφτιαξα αυτά και ξεπέρασα αυτό το σφάλμα αλλά προφανώς έγινε παράκαμψη και όχι διόρθωση. Γιατί;Γιατί μου ότι στοιχεία και αν δώσω μου πετάει ότι έγινε εγγραφή χρήστη ακόμα και αν υπάρχει ήδη ο χρήστης. Προσπάθησα να το φτιάξω αλλά ή θα μου πετάει πάντα ότι υπάρχει ο χρήστης, ή θα μου πετάει ότι έγινε επιτυχής εγγραφή... PS: Στην βάση πάντως δεν είδα νέα εγγραφή ούτε στη μια περίπτωση, ούτε στην άλλη.Μάλλον πως θα χρησιμοποιήσω PDO μεμονωμένα σε αυτό το αρχείο γιατί ακόμα και κάτι σωστό να δω, δε μπορώ να καταλάβω αν μου είναι χρήσιμο ή όχι Χωρίς να ξέρω PHP καταλήγω πάντα να ασχολούμαι εγώ και με αυτό. Εε που θα πάει, θα κάτσω κάποτε που θα υπάρχει ο χρόνος να τη μάθω! Link to comment Share on other sites More sharing options...
nucleus Σεπτέμβριος 1, 2015 #15 Κοινοποίηση Σεπτέμβριος 1, 2015 To prepared statement το κάνεις close? Link to comment Share on other sites More sharing options...
UltraB Σεπτέμβριος 1, 2015 Author #16 Κοινοποίηση Σεπτέμβριος 1, 2015 Στο αρχείο που δουλευώ ναι, στο αρχείο εδώ όχι. Όχι πως αλλάζει κάτι βέβαια, ότι μου πετούσε πριν, μου πετάει. Link to comment Share on other sites More sharing options...
nucleus Σεπτέμβριος 1, 2015 #17 Κοινοποίηση Σεπτέμβριος 1, 2015 https://secure.php.net/manual/en/mysqli-result.num-rows.php$query->execute();$query->store_result();$rows = $query->num_rows;Μήπως πρέπει να κάνεις store το result για να μετρήσει η num rows? Link to comment Share on other sites More sharing options...
nucleus Σεπτέμβριος 2, 2015 #18 Κοινοποίηση Σεπτέμβριος 2, 2015 http://www.w3schools.com/php/php_mysql_select.asp Αν στην SignUp αλλάξεις το παρακάτω σημείο$query = ("SELECT * FROM users WHERE username = ?");$query = $mysqli->prepare($query); $query->bind_param("s", $Username);$query->execute();if($query->num_rows() == 0)με τον κώδικα που έχει στην παραπάνω σελίδα και το κάνεις με query και όχι με prepared statement? Link to comment Share on other sites More sharing options...
UltraB Σεπτέμβριος 2, 2015 Author #19 Κοινοποίηση Σεπτέμβριος 2, 2015 Θα το δοκιμάσω. Ευχαριστώ πάντως μου ασχολείσαι, είσαι ο μόνος πραγματικά που ασχολείται όσες φορές χρειάστηκα κάτι αντίστοιχο! Link to comment Share on other sites More sharing options...
nucleus Σεπτέμβριος 2, 2015 #20 Κοινοποίηση Σεπτέμβριος 2, 2015 Και γιατί όχι πλάκα έχει αν δεν δουλέψει και πάλι ετοιμάσου για teamviewer το weekend αν θες Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now