Prepared Statement με 2 ορίσματα

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
Stavros20gr

Prepared Statement με 2 ορίσματα

Δημοσίευση από Stavros20gr » 14 Ιούλ 2010 16:03

Γεια σε όλους και καλώς σας βρήκα!

Χρησιμοποιώ το ακόλουθο prepered statement για να κάνω select δεδομένα από τη βάση μου και να τα παρουσιάσω σε μία php σελίδα.

Κώδικας: Επιλογή όλων

mysql_query('PREPARE my_query FROM "SELECT name, text FROM table WHERE id=?";',$connection);
	mysql_query('SET @test_param='.mysql_real_escape_string($_GET["id"]),$connection);
	$result = mysql_query('EXECUTE my_query USING @test_param;',$connection);
	if(mysql_num_rows($result) == 0){
		header("Location: ".$false."");
	}
	$row = mysql_fetch_array($result, MYSQL_ASSOC);
	$name = $row["name"];
	$text = $row["text"];
	mysql_query('DEALLOCATE PREPARE my_query;',$connection);
Την υλοποίηση αυτή τη βρήκα στο forum και την προσάρμοσα στις ανάγκες μου. Μπορείτε να μου πείτε πως μπορώ να τροποποιήσω το παραπάνω κομμάτι κώδικα, ώστε να δέχεται 2 ή τρία ορίσματα (και όχι μόνο το id);

sxsweb
Δημοσιεύσεις: 33
Εγγραφή: 14 Δεκ 2009 16:24

Prepared Statement με 2 ορίσματα

Δημοσίευση από sxsweb » 14 Ιούλ 2010 18:27

Κοιταξε το fengnet.com/book/MySQL.5.0.Manual/ch12s07.html

Για δύο ορίσματα:

Κώδικας: Επιλογή όλων

mysql_query('PREPARE my_query FROM "SELECT name, text FROM table WHERE FIRST_PARAM=? AND SECOND_PARAM=?";',$connection);
   mysql_query('SET @param1='FIRST PARAMETER',$connection);
   mysql_query('SET @param2='SECOND PARAMETER',$connection);
   $result = mysql_query('EXECUTE my_query USING @param1,@param2;',$connection);
   if(mysql_num_rows($result) == 0){
      header("Location: ".$false."");
   }
   $row = mysql_fetch_array($result, MYSQL_ASSOC);
   $name = $row["name"]; 

Stavros20gr

Prepared Statement με 2 ορίσματα

Δημοσίευση από Stavros20gr » 14 Ιούλ 2010 19:40

Ευχαριστώ πολύ για την απάντηση! Θα το δοκιμάσω σύντομα...

Stavros20gr

Prepared Statement με 2 ορίσματα

Δημοσίευση από Stavros20gr » 21 Ιούλ 2010 15:18

Ευχαριστώ και πάλι το φίλο sxsweb για τη λύση που έδωσε, η οποία δούλευε περίφημα!

Επαναφέρω, ωστόσο, το θέμα, για να ρωτήσω πως μπορεί να προσαρμοστεί η παραπάνω λύση στην ακόλουθη εντολή:

Κώδικας: Επιλογή όλων

$query = "INSERT INTO comments VALUES ('', '".$name."', '".$text."', now())";
Το πρώτο όρισμα είναι ένα id με auto increment και το τελευταίο η στιγμή που προστίθεται η εγγραφή στη βάση δεδομένων. Τα πεδία που επιθυμούμε να ελέγξουμε είναι τα name και text.

Οι προσπάθειες που έκανα δεν είχαν αποτέλεσμα, συνεπώς αν κάποιος έχει μια λύση ας κοπιάσει!!! :D

sxsweb
Δημοσιεύσεις: 33
Εγγραφή: 14 Δεκ 2009 16:24

Prepared Statement με 2 ορίσματα

Δημοσίευση από sxsweb » 26 Ιούλ 2010 20:01

Προσάρμοσε το ερώτημα να δέχεται στα VALUES παραμέτρους με την μορφή ?
όπως φαίνεται και το select ερώτημα.

Η τελευταία παράματρος παίρνει όρισμα από συνάρτηση μπορείς να την ορίσεις κάπως έτσι

Κώδικας: Επιλογή όλων

 mysql_query("SET @param='".now()."',$connection); 

Stavros20gr

Prepared Statement με 2 ορίσματα

Δημοσίευση από Stavros20gr » 27 Ιούλ 2010 13:25

Ευχαριστώ για την απάντηση, sxsweb! Δυστυχώς, όμως, δε δουλεύει.

Αν το γράψω όπως μου το έδωσες, χτυπάει λάθος γιατί το now() το διαβάζει σα συνάρτηση της php και δε βρίσκει τίποτα. Το γράφω, λοιπόν, έτσι

Κώδικας: Επιλογή όλων

mysql_query('SET @param3=now()',$connection);
Δε χτυπάει λάθος, αλλά δεν περνάει τίποτα στη ΒΔ.

sxsweb
Δημοσιεύσεις: 33
Εγγραφή: 14 Δεκ 2009 16:24

Prepared Statement με 2 ορίσματα

Δημοσίευση από sxsweb » 27 Ιούλ 2010 16:30

Αν εννοείς το now() της mysql δεν θα το δώσεις ως παράμετρο. Αλλα κανονικά στο prepared ερώτημα. Οι τιμές που ορίζονται μέσω php θα είναι ως παραμετρο.

Stavros20gr

Prepared Statement με 2 ορίσματα

Δημοσίευση από Stavros20gr » 28 Ιούλ 2010 13:51

Κατ'αρχάς sxsweb σε ευχαριστώ για τη βοήθειά σου!

Ο κώδικας που έχω είναι για να περάσει σε μια βάση εγγραφές για ένα guestbook.

Κώδικας: Επιλογή όλων

	mysql_query('PREPARE my_query FROM "INSERT INTO comments VALUES ("", ?, ?, now())";',$connection);
	mysql_query('SET @param1='.$name,$connection);
	mysql_query('SET @param2='.$text,$connection);
	$result = mysql_query('EXECUTE my_query USING @param1,@param2;',$connection);
	mysql_query('DEALLOCATE PREPARE my_query;',$connection);
Το πρώτο όρισμα είναι id (auto increment), έπειτα όνομα και κείμενο και τέλος η χρονική στιγμή. Το παραπάνω, όμως, ενώ δε βγάζει σφάλμα, δε δουλεύει καθώς δεν περνάει την εγγραφή στη βάση. Το παρακάτω απλό κομμάτι κώδικα λειτουργεί κανονικά.

Κώδικας: Επιλογή όλων

	$query = "INSERT INTO comments VALUES ('', '".$name."', '".$text."', now())";
	$result = mysql_query($query, $connection) or die(mysql_error());
Καμία ιδέα για το τι μπορεί να φταίει;

Άβαταρ μέλους
Khronos
Δημοσιεύσεις: 754
Εγγραφή: 11 Δεκ 2006 14:43
Τοποθεσία: Ηράκλειο

Prepared Statement με 2 ορίσματα

Δημοσίευση από Khronos » 28 Ιούλ 2010 13:56

Να ρωτήσω κάτι άλλο εγώ? Γιατί χρησιμοποιείς prepared statements? Σε βολεύουν πιο πολύ? Απότι βλέπω γίνονται πιο πολλά queries με αυτόν τον τρόπο απο το να τα έγραφες απευθείας.

Stavros20gr

Prepared Statement με 2 ορίσματα

Δημοσίευση από Stavros20gr » 28 Ιούλ 2010 14:15

Khronos έγραψε:Να ρωτήσω κάτι άλλο εγώ? Γιατί χρησιμοποιείς prepared statements? Σε βολεύουν πιο πολύ? Απότι βλέπω γίνονται πιο πολλά queries με αυτόν τον τρόπο απο το να τα έγραφες απευθείας.
Για καλύτερη προστασία εναντίον SQL injections.

sxsweb
Δημοσιεύσεις: 33
Εγγραφή: 14 Δεκ 2009 16:24

Prepared Statement με 2 ορίσματα

Δημοσίευση από sxsweb » 29 Ιούλ 2010 12:47

Δοκίμασε να αλλάξεις τα ΄΄με " " και το αντίστροφο στο prepared ερώτημα. Η άλλαξε το auto inrement id απο " " σε NULL ή αφαίρεσε το τελείως, απο το ερώτημα. Μπορεί να φταίει αυτό.


Αν και αυτό δεν λειτουργήσει και τελικα δεν φταει το id αφαίρεσε την συναρτηση now(), και δώσε τιμη στο αντίστοιχο πεδίο μέσω php και επιπλέον παραμέτρου

Κώδικας: Επιλογή όλων

date("Y/m/d G:i:s",time())

Stavros20gr

Prepared Statement με 2 ορίσματα

Δημοσίευση από Stavros20gr » 29 Ιούλ 2010 13:13

Βασικά δε δίνω όρισμα για το id, ενώ άλλαξα και το πεδίο date ώστε να είναι timestamp και όταν γίνεται εγγραφή στη ΒΔ να παίρνει τιμή μόνο του. Και πάλι, όμως, κανένα αποτέλεσμα! Ορίστε και ο κώδικας αυτή τη στιγμή...

Κώδικας: Επιλογή όλων

	mysql_query('PREPARE my_query FROM "INSERT INTO comments (name, text) VALUES (?, ?)";',$connection);
	mysql_query('SET @param1='.$name, $connection);
	mysql_query('SET @param2='.$text, $connection);
	$result = mysql_query('EXECUTE my_query USING @param1,@param2;',$connection);
	mysql_query('DEALLOCATE PREPARE my_query;',$connection);
Μάλλον θα εγκαταλείψω την προσπάθεια γιατί δε βλέπω φως στο τούνελ...

Άβαταρ μέλους
Khronos
Δημοσιεύσεις: 754
Εγγραφή: 11 Δεκ 2006 14:43
Τοποθεσία: Ηράκλειο

Prepared Statement με 2 ορίσματα

Δημοσίευση από Khronos » 29 Ιούλ 2010 13:48

Δοκίμασε στο τέλος όλων των queries να προσθέσεις αυτά μήπως σου πετάξει κάποιο error.

Κώδικας: Επιλογή όλων

mysql_query('DEALLOCATE PREPARE my_query;',$connection) or die(mysql_error());

Stavros20gr

Prepared Statement με 2 ορίσματα

Δημοσίευση από Stavros20gr » 29 Ιούλ 2010 15:00

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

sxsweb
Δημοσιεύσεις: 33
Εγγραφή: 14 Δεκ 2009 16:24

Prepared Statement με 2 ορίσματα

Δημοσίευση από sxsweb » 30 Ιούλ 2010 09:54

Έλεγξε τα δικαιώματα του χρήστη της βάσης αν μπορεί να κάνει Insert.

Στην συνέχεια έλεγξε τον πίνακα μήπως έχει "χαλάσει" το auto increment id. Κάποιες φορές
εισάγονται εγγραφές με μεγαλύτερο id και κολλάει το auto increment και θα πρέπει manually να ενημερώσεις πιο είναι το επόμενο.

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες