Jump to content



PHP - Convert PDO to MySQLi (Prepare & Execute)


UltraB

Recommended Posts

Καλησπέρα παιδιά, προσπαθώ να φτιάξω στο παρακάτω κώδικα το σημείο από την σειρά 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, οπότε όποια λαθάκια στο κώδικα, συγχωρέστε τα, και όποιες προτάσεις για αλλαγή, ευπρόσδεκτες :)

  • Like 1
Link to comment
Share on other sites

Αν και έχω χρόνια να γράψω php πέρα από το manual δεν έχω να προτείνω κάτι

 

http://php.net/manual/en/mysqli.prepare.php

http://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.

Έγινε επεξεργασία από nucleus
Link to comment
Share on other sites

Τώρα μου πετάει "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

Ολόκληρος ο κώδικας από το παράδειγμα της 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

Κατάφερα και το προχώρησα λίγο και τώρα μου πετάει σφάλμα:
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

Καταρχήν

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

 

Καταρχήν

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

Αν το sql statement είναι λάθος συντακτικά η prepare επιστρέφει false. Ίσως να πρέπει να το δεις εκεί. Από το stack overflow

if($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);
Έγινε επεξεργασία από nucleus
Link to comment
Share on other sites

Λοιπόν, τα έφτιαξα αυτά και ξεπέρασα αυτό το σφάλμα αλλά προφανώς έγινε παράκαμψη και όχι διόρθωση. Γιατί;
Γιατί μου ότι στοιχεία και αν δώσω μου πετάει ότι έγινε εγγραφή χρήστη ακόμα και αν υπάρχει ήδη ο χρήστης.

 

Προσπάθησα να το φτιάξω αλλά ή θα μου πετάει πάντα ότι υπάρχει ο χρήστης, ή θα μου πετάει ότι έγινε επιτυχής εγγραφή...

PS: Στην βάση πάντως δεν είδα νέα εγγραφή ούτε στη μια περίπτωση, ούτε στην άλλη.

Μάλλον πως θα χρησιμοποιήσω PDO μεμονωμένα σε αυτό το αρχείο γιατί ακόμα και κάτι σωστό να δω, δε μπορώ να καταλάβω αν μου είναι χρήσιμο ή όχι  :(

Χωρίς να ξέρω PHP καταλήγω πάντα να ασχολούμαι εγώ και με αυτό. Εε που θα πάει, θα κάτσω κάποτε που θα υπάρχει ο χρόνος να τη μάθω! 

Link to comment
Share on other sites

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Δημιουργία...

Important Information

Ο ιστότοπος theLab.gr χρησιμοποιεί cookies για να διασφαλίσει την καλύτερη εμπειρία σας κατά την περιήγηση. Μπορείτε να προσαρμόσετε τις ρυθμίσεις των cookies σας , διαφορετικά θα υποθέσουμε ότι είστε εντάξει για να συνεχίσετε.