Προς το περιεχόμενο

Δυναμικότητα σελίδας με php


killer76

Προτεινόμενες αναρτήσεις

Καλησπέρα και καλή εβδομάδα με μια ερώτηση. Επειδή αρχίζω σιγα σιγα να ασχολούμε με php και δυναμικές σελίδες. Θέλω να ρωτήσω αν είναι σωστός ο τρόπος που έμαθα να χρησιμοποιώ κάποιες παραμέτρους, γιατί μου φαίνεται οτι θα γίνονται πολύ μεγάλοι και πολύπλοκοι όσο μεγαλώνει η σελίδα μου.

Απο το μενού εμφανίζω μια λίστα αποτελεσμάτων από την mysql που το WHERE του SELECT καθορίζεται από μια μεταβλητή που θα αναθέσει το *get από το url. Δηλαδή για παράδειγμα βάζω το κώδικα όπως παρακάτω γιανα μην μου πετάει σφάλμα αν κάτι είναι NULL. Απορώ όμως είναι αυτός ο σωστός τρόπος; Γιατί αν θέλω να βάλω για παράδειγμα άλλες 10 παραμέτρους σαν φίλτρα (διαθεσιμότητα, εύρος τιμών, χρώμα, μέγεθος οθόνης κλπ) είναι λογικό να φτιάξω ένα σιδηρόδρομο url και 300 γραμμές κώδικα με τα if και else του select; Και επίσης αν κάποια στιγμή θελήσω να βάλω μια παράμετρο ακόμα, σκεφτείτε σπαζοκεφαλιά στα elseif. 

Παρακαλώ όποιος μπορεί να βοηθήσει για μια πιο βέλτιστη εφαρμογή αυτού που γράφω και αν ειναι σωστος ο τροπος μου. Μην μου λέτε για αλλες γλώσσες (python,js κλπ)

 

$os= sanitize(isset($_GET['os'])) ? sanitize($_GET['os']) : null;
$hdd = sanitize(isset($_GET['hdd'])) ? sanitize($_GET['hdd']) : null;

if (os != NULL && hdd == NULL){
$sql="SELECT * FROM mobiles
WHERE os ='$os'";}
elseif (os == NULL && hdd != NULL){
$sql="SELECT * FROM mobiles
WHERE hdd ='$hdd'";}
elseif (os == NULL && hdd == NULL){
$sql="SELECT * FROM mobiles";}
else {
$sql="SELECT * FROM mobiles
WHERE hdd ='$hdd' AND os ='$os'";}

 

 

*Χρησιμοποιώ sanitize στα string για αποφυγή sql injection κλπ.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Καλησπέρα. Το query μπορεί να γραφτεί και ως 

 

$sql =  "SELECT * FROM mobile WHERE ".implode(" AND ", $whereArgs);

όπου μέσα στο $whereArgs θα βάζεις πχ 

array_push($whereArgs, " `hdd` = '".$hdd."'");

 

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)
6 ώρες πριν, killer76 είπε

Καλησπέρα και καλή εβδομάδα με μια ερώτηση. Επειδή αρχίζω σιγα σιγα να ασχολούμε με php και δυναμικές σελίδες. Θέλω να ρωτήσω αν είναι σωστός ο τρόπος που έμαθα να χρησιμοποιώ κάποιες παραμέτρους, γιατί μου φαίνεται οτι θα γίνονται πολύ μεγάλοι και πολύπλοκοι όσο μεγαλώνει η σελίδα μου.

Απο το μενού εμφανίζω μια λίστα αποτελεσμάτων από την mysql που το WHERE του SELECT καθορίζεται από μια μεταβλητή που θα αναθέσει το *get από το url. Δηλαδή για παράδειγμα βάζω το κώδικα όπως παρακάτω γιανα μην μου πετάει σφάλμα αν κάτι είναι NULL. Απορώ όμως είναι αυτός ο σωστός τρόπος; Γιατί αν θέλω να βάλω για παράδειγμα άλλες 10 παραμέτρους σαν φίλτρα (διαθεσιμότητα, εύρος τιμών, χρώμα, μέγεθος οθόνης κλπ) είναι λογικό να φτιάξω ένα σιδηρόδρομο url και 300 γραμμές κώδικα με τα if και else του select; Και επίσης αν κάποια στιγμή θελήσω να βάλω μια παράμετρο ακόμα, σκεφτείτε σπαζοκεφαλιά στα elseif. 

Παρακαλώ όποιος μπορεί να βοηθήσει για μια πιο βέλτιστη εφαρμογή αυτού που γράφω και αν ειναι σωστος ο τροπος μου. Μην μου λέτε για αλλες γλώσσες (python,js κλπ)

 


$os= sanitize(isset($_GET['os'])) ? sanitize($_GET['os']) : null;
$hdd = sanitize(isset($_GET['hdd'])) ? sanitize($_GET['hdd']) : null;

if (os != NULL && hdd == NULL){
$sql="SELECT * FROM mobiles
WHERE os ='$os'";}
elseif (os == NULL && hdd != NULL){
$sql="SELECT * FROM mobiles
WHERE hdd ='$hdd'";}
elseif (os == NULL && hdd == NULL){
$sql="SELECT * FROM mobiles";}
else {
$sql="SELECT * FROM mobiles
WHERE hdd ='$hdd' AND os ='$os'";}

 

 

*Χρησιμοποιώ sanitize στα string για αποφυγή sql injection κλπ.

 

Καλή ερώτηση.

Ο καλύτερος τρόπος είναι να ορίσεις εξ'αρχής τις παραμέτρους ως variables όπως ήδη κάνεις και κατόπιν  να τις προσθέτεις σε array εφόσον έχουν πάρει τιμή  όπου θα τις χρησιμοποιήσεις για να  κάνεις construct με δυναμικό τρόπο τo query με τις παραμέτρους εφόσον ($condition) υπάρχουν κάθε φορά.

 

Δηλαδή

$sql = 'SELECT * FROM mobiles';

$condition = array();
$add_param = array();


if (!empty($os)) {
    $condition[] = "os = '" . $os . "'";
    $add_param[] = $os;
}

if (!empty($hdd)) {
    $condition[] = "hdd = '" . $hdd . "'";
    $add_param[] = $hdd;
}

// προσθέτεις n parameter conditions


if (count($condition)) { // εάν το $condition array ισχύει μετράει πόσες τιμές πεταχτήκαν μέσα
    $sql .= ' WHERE ' . implode(' AND ', $condition); // προσθέτει με AND τα φίλτρα στο WHERE για κάθε condition 
}

 

Επεξ/σία από The King
  • Thanks 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Τι sanitize χρησιμοποιείς και μπορείς να εισαι 10000% σίγουρος ότι δεν θα πάθεις SQL Injection;

Αν δεν κάνω λάθος, καμία sanitize μέθοδος δεν ειναι 1000% ασφαλής σε όλα τα τερματικά και μερικές, προκαλούν αλλες περίεργες παρενέγειες. Γιατί δεν χρησιμοποιείς Prepared Statements να εισαι 1000000% σιγουρος;

Επεξ/σία από flienky
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 2 εβδομάδες αργότερα...
Δημοσ. (επεξεργασμένο)

Παίδες καλησπέρα και ευχαριστώ για τις απαντήσεις σας. Ήμουν διακοπές και από σήμερα θα ξανασχοληθώ με αυτό που φτιάχνω. Διαβάζω τις κώδικες σας και προσπαθώ να εμπεδώσω λίγο το πως δουλεύουν αν και νομίζω οτί το "πιάνω" σιγα σιγα το νόημα. Με Prepared Statements προσπαθώ να καταλάβω τι παίζει αλλά μου φαίνεται λίγο απλησίαστο προς το παρόν.

 

Θα ήθελα να ρωτήσω αν μπορείτε να μου προτείνετε κάποιο καλό βιβλίο να αγοράσω, κανα pdf κλπ, στα Ελληνικά (Το ξέρω οτι είναι δύσκολο) με PHP, Mysgl (ισως και js) που να μην λέει όμως μόνο για foreach και echo αλλά και για Prepared Statements, Sanitize κλπ.

 

Επεξ/σία από killer76
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Στις 7/7/2018 στις 4:57 ΜΜ, killer76 είπε

, στα Ελληνικά (Το ξέρω οτι είναι δύσκολο) με PHP, Mysgl (ισως και js) που να μην λέει όμως μόνο για foreach και echo αλλά και για Prepared Statements, Sanitize κλπ.

Φιλική συμβουλή, αν θες να ασχοληθείς σοβαρά με το αντικείμενο, ξεσκόνισε τα αγγλικά σου...

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 4 εβδομάδες αργότερα...
Στις 3/8/2018 στις 9:54 ΜΜ, 3wPsO είπε

Γιατί όχι με LIKE?

Τι εννοείς?

Ρε παίδες για να μην ανοίγω νέο νήμα....

Έχω βάλει ένα file upload στην php και δουλεύει μια χαρά (ανεβαίνουν οι φώτο, εμφανίζονται μια χαρά κλπ). Επίσης έχω φτιάξει και ένα php για edit μιας καρτέλας, που επίσης δουλεύει τέλεια (τραβάει τα δεδομένα από την βάση και συμπληρώνει τα text, τσεκάρει τα checkboxes κλπ) και μετά με ένα save αποθηκευει τις αλλαγές.

2 ερωτήσεις (αν γίνεται, χωρίς να αλλάξω πολύ τον κώδικα και μπερδευτώ)...

1) Τώρα έχω μια φόρμα σε μια σελίδα edit.php και ένα κουμπί αποθήκευση που παέι σε μια σελίδα  edit_saves.php, παίρνει τα πεδία τις φόρμας και αποθηκεύει τις αλλαγές στην βάση. Μετά το query έχω βάλει να κάνει redirect στην αρχική (έτσι θέλω). Θέλω όμως να βάλω και ένα δεύτερο κουμπί στην σελίδα edit.php που να λέει "εφαρμογή των αλλαγών", ωστε στην περίπτωση που θέλω απλά  να αποθηκευτούν στην βάση η αλλαγές αλλά να μην φέυγω από την καρτέλα (δηλαδή να ξανακάνω redirect στην edit.php) πως μπορώ να το κάνω?

2) ΚΑΙ ΒΑΣΙΚΟΤΕΡΟ. Ενω τα έχω φτιάξει όλα μια χαρά, στην φόρμα edit.php κανεί get τα δεδομένα από την βάση, τα εμφανίζει στα πεδία και αν τα αλλάξω, αποθηκεύει τις αλλαγές, αν δεν τα αλλάξω αποθηκεύει τις ίδιες. Μια χαρά. Έχω βάλει όμως και κουμπί για upload εικόνας. Όταν φορτώνω εικόνα, την ανεβάζει και την εμφανίζει κανονικά. Αν μπώ όμως να κάνω edit την καρτέλα και να αλλάξω π.χ. το τίτλο, το input της εικόνας φαίνεται άδειο οπότε αν δεν ξαναφορτώσω την εικόνα (δεν το θέλω αυτό), την εξαφανίζει. Τι μπορώ να κάνω ωστε να "γεμίζει το input"με την εικόνα που ήδη υπάρχει, αντι για "no file selected". Στο παρακάτω κώδικα δοκίμασα να κρύψω το input με ένα else (δηλαδή να εμφανίζεται αν το πεδίο Photo είναι άδειο), όντως δεν εμφανιζόταν, αλλά την ζημιά την έκανε.

Snip20180805_9.png.c08a621b6e52dd06fea74f77ccceeecd.png

Ο κώδικας που χρησιμοποιώ είναι....

Στο edit.php

<div class="form-group">
    <label for="image">Avatar</label>
    <?php if(!empty($row['Photo'])) { ?>
<br><img src="../images/<?php echo $row["Photo"]; ?>" width="300" />
<?php } ?>
     <input type="file" name="image" />
</div>

Στο edit_saves.php

if(isset($_FILES['image'])){
  $errors= array();
  $file_name = $_FILES['image']['name'];
  $file_size =$_FILES['image']['size'];
  $file_tmp =$_FILES['image']['tmp_name'];
  $file_type=$_FILES['image']['type'];
  $file_ext=strtolower(end(explode('.',$_FILES['image']['name'])));
  if($file_size > 2097152666655){
     $errors[]='File size must be excately 2 MB';
  }
  if(empty($errors)==true){
     move_uploaded_file($file_tmp,"../images/".$file_name);
  }else{
     print_r($errors);
  }
}
$Photo = $_FILES['image']['name'];

.......
και μετα το query για την εισαγωγη
.......

 

 

 

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

10 λεπτά πριν, killer76 είπε

Τι εννοείς?

Ρε παίδες για να μην ανοίγω νέο νήμα....

Έχω βάλει ένα file upload στην php και δουλεύει μια χαρά (ανεβαίνουν οι φώτο, εμφανίζονται μια χαρά κλπ). Επίσης έχω φτιάξει και ένα php για edit μιας καρτέλας, που επίσης δουλεύει τέλεια (τραβάει τα δεδομένα από την βάση και συμπληρώνει τα text, τσεκάρει τα checkboxes κλπ) και μετά με ένα save αποθηκευει τις αλλαγές.

2 ερωτήσεις (αν γίνεται, χωρίς να αλλάξω πολύ τον κώδικα και μπερδευτώ)...

1) Τώρα έχω μια φόρμα σε μια σελίδα edit.php και ένα κουμπί αποθήκευση που παέι σε μια σελίδα  edit_saves.php, παίρνει τα πεδία τις φόρμας και αποθηκεύει τις αλλαγές στην βάση. Μετά το query έχω βάλει να κάνει redirect στην αρχική (έτσι θέλω). Θέλω όμως να βάλω και ένα δεύτερο κουμπί στην σελίδα edit.php που να λέει "εφαρμογή των αλλαγών", ωστε στην περίπτωση που θέλω απλά  να αποθηκευτούν στην βάση η αλλαγές αλλά να μην φέυγω από την καρτέλα (δηλαδή να ξανακάνω redirect στην edit.php) πως μπορώ να το κάνω?

2) ΚΑΙ ΒΑΣΙΚΟΤΕΡΟ. Ενω τα έχω φτιάξει όλα μια χαρά, στην φόρμα edit.php κανεί get τα δεδομένα από την βάση, τα εμφανίζει στα πεδία και αν τα αλλάξω, αποθηκεύει τις αλλαγές, αν δεν τα αλλάξω αποθηκεύει τις ίδιες. Μια χαρά. Έχω βάλει όμως και κουμπί για upload εικόνας. Όταν φορτώνω εικόνα, την ανεβάζει και την εμφανίζει κανονικά. Αν μπώ όμως να κάνω edit την καρτέλα και να αλλάξω π.χ. το τίτλο, το input της εικόνας φαίνεται άδειο οπότε αν δεν ξαναφορτώσω την εικόνα (δεν το θέλω αυτό), την εξαφανίζει. Τι μπορώ να κάνω ωστε να "γεμίζει το input"με την εικόνα που ήδη υπάρχει, αντι για "no file selected". Στο παρακάτω κώδικα δοκίμασα να κρύψω το input με ένα else (δηλαδή να εμφανίζεται αν το πεδίο Photo είναι άδειο), όντως δεν εμφανιζόταν, αλλά την ζημιά την έκανε.

Snip20180805_9.png.c08a621b6e52dd06fea74f77ccceeecd.png

Ο κώδικας που χρησιμοποιώ είναι....

Στο edit.php


<div class="form-group">
    <label for="image">Avatar</label>
    <?php if(!empty($row['Photo'])) { ?>
<br><img src="../images/<?php echo $row["Photo"]; ?>" width="300" />
<?php } ?>
     <input type="file" name="image" />
</div>

Στο edit_saves.php


if(isset($_FILES['image'])){
  $errors= array();
  $file_name = $_FILES['image']['name'];
  $file_size =$_FILES['image']['size'];
  $file_tmp =$_FILES['image']['tmp_name'];
  $file_type=$_FILES['image']['type'];
  $file_ext=strtolower(end(explode('.',$_FILES['image']['name'])));
  if($file_size > 2097152666655){
     $errors[]='File size must be excately 2 MB';
  }
  if(empty($errors)==true){
     move_uploaded_file($file_tmp,"../images/".$file_name);
  }else{
     print_r($errors);
  }
}
$Photo = $_FILES['image']['name'];

.......
και μετα το query για την εισαγωγη
.......

1. Δοκίμασε με AJAX (javascript... για πιο εύκολα jquery)

2. Αν υπάρχει εικόνα θα σου πρότεινα να μην εμφανίζεις το input, αλλά την ίδια την εικόνα και κάποιο κουμπί που θα σου προσθέτει δυναμικά το input ( πάλι με javascript) σε περιπτωση που θες να την αλλάξεις και κατά το Update της db να πειράζεις το πεδίο της εικόνας μόνο αν υπάρχει το input κατά την αποστολή. 

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)
59 λεπτά πριν, rafinos είπε

1. Δοκίμασε με AJAX (javascript... για πιο εύκολα jquery)

2. Αν υπάρχει εικόνα θα σου πρότεινα να μην εμφανίζεις το input, αλλά την ίδια την εικόνα και κάποιο κουμπί που θα σου προσθέτει δυναμικά το input ( πάλι με javascript) σε περιπτωση που θες να την αλλάξεις και κατά το Update της db να πειράζεις το πεδίο της εικόνας μόνο αν υπάρχει το input κατά την αποστολή. 

Δεν ξέρω γιατί αλλά με φοβίζει πολύ η JS. Θα ασχοληθώ σιγά σιγά.

Στο 2, μου έκοψε και έκανα μια πατέντα που δούλεψε. Δεν ξέρω βέβαια αν είναι έγκλημα από θέμα ταχύτητας, ασφάλειας κλπ

Μέσα στο edit_saves.php έφτιαξα ενα sql select "SELECT Photo FROM table WHERE id=$id", μετά κάνω ένα foreach για να τραβήξει την υπάρχον εικόνα και την αποθηκεύω σε μια μεταβλητή.

foreach ($rows as $row):
    $oldPhoto = $row["Photo"];
endforeach;

και μετά που μαζεύω τις μεταβλητές να τις κάνω update, έβαλα ένα if αν δεν έχει σεταριστεί εικόνα από την φόρμα. Δηλαδή...

if(!empty($_FILES['image']['name'])) {
$Photo = $_FILES['image']['name'];} else {
    $Photo = $oldPhoto;
}

 

Δουλέυει, αλλά πολύ χάλια σαν κώδικας?

 

 

Επεξ/σία από killer76
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

11 ώρες πριν, killer76 είπε

Δεν ξέρω γιατί αλλά με φοβίζει πολύ η JS. Θα ασχοληθώ σιγά σιγά.

Στο 2, μου έκοψε και έκανα μια πατέντα που δούλεψε. Δεν ξέρω βέβαια αν είναι έγκλημα από θέμα ταχύτητας, ασφάλειας κλπ

Μέσα στο edit_saves.php έφτιαξα ενα sql select "SELECT Photo FROM table WHERE id=$id", μετά κάνω ένα foreach για να τραβήξει την υπάρχον εικόνα και την αποθηκεύω σε μια μεταβλητή.

foreach ($rows as $row):
    $oldPhoto = $row["Photo"];
endforeach;

και μετά που μαζεύω τις μεταβλητές να τις κάνω update, έβαλα ένα if αν δεν έχει σεταριστεί εικόνα από την φόρμα. Δηλαδή...

if(!empty($_FILES['image']['name'])) {
$Photo = $_FILES['image']['name'];} else {
    $Photo = $oldPhoto;
}

Δουλέυει, αλλά πολύ χάλια σαν κώδικας?

Κατά κάποιον τρόπο είναι στο ίδιο σκεπτικό με το δικό μου. Δε νομίζω πως είναι χάλια ο κώδικας.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...