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

προβλημα σε php & mysql


wolfakisevag

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

Δημοσ.

παιδιά για σας φτιάχνο μια σελίδα οπου έχει καποια προιόντα και ο επισκέπτης πατώντας την εικόνα του προιόντος ψηφήζει το προιον.οι πινακες που αναφέρονται είναι οι:

create table perigrafh ( code int unsigned not null auto_increment primary key,

typos char (100),

eikona char(100))DEFAULT CHARSET=utf8 DEFAULT COLLATE=utf8_general_ci

CHARSET=utf8 COLLATE=utf8_general_ci;

 

create table pshfos (kodikos int unsigned not null auto_increment,

code3 int unsigned not null references perigrafh(code),

vote int,

pshfos_create_time DATETIME,

primary key(kodikos,code3)

)DEFAULT CHARSET=utf8 DEFAULT COLLATE=utf8_general_ci

CHARSET=utf8 COLLATE=utf8_general_ci;

 

 

όταν πατάω στην εικόνα του προιόντος κάνει insert τον ψηφο:

 

$res= mysqli_query($mysqli,"INSERT INTO pshfos (code3,vote, pshfos_create_time) VALUES ('".$_GET["code"]."','".$i."',now())") οπου $i=0;

or die(mysqli_error($mysqli));

 

για να δώ τα αποτελέσματα των ψηφων κάνω:

$verify_res2 = mysqli_query($mysqli,"select perigrafh.eikona,sum(vote)

from perigrafh,pshfos

where perigrafh.code=pshfos.code3

group by perigrafh.code

")

 

το πρόβλημα που αντιμετοπίζω είναι ότι θέλω να κάνω ένα σύνδεσμο που να βρίσκει την εικόνα με τους περισσότερους ψηφους και εχω δοκιμάσει αυτο :

$verify_res2 = mysqli_query($mysqli,"select perigrafh.eikona,mαχ(vote)

from perigrafh,pshfos

where perigrafh.code=pshfos.code3

group by perigrafh.code

")

αλλα δεν είναι σωστό μήπος έχει κανείς ιδέα πως να το γράψω εχω δοκιμάσει και κάτι άλλα που έβγαζαν σφάλματα ενω το πάνω δεν έβγαζε σφάλματα αλλά δεν είναι σωστο αφού σε όλα τα vote=1.αν κάποιοσ μου βρεί λύση θα με βοηθούσε πάρα πολύ γιατι τώρα 2 μερες έχο κολύσει σε αυτο.ευχαριστό πολύ εκ τον προτέρων!

Δημοσ.

2 ώρες μόνο και τα παράτησες;

 

Ένας απλός τρόπος είναι ο εξής:

 

>
SELECT perigrafh.eikona
FROM `perigrafh`
INNER JOIN pshfos ON perigrafh.code = pshfos.code3
WHERE pshfos.vote = ( SELECT MAX( `vote` ) FROM `pshfos` )

 

Βέβαια, αυτό άμα έχεις δύο εικόνες με τα ίδια votes θα τις φέρει και τις δύο. Άμα θες να το περιορίσεις πρέπει να προσθέσεις ένα LIMIT 1. Επίσης άμα είναι να χρησιμοποιήσεις το παραπάνω βάλε ένα INDEX στο vote.

 

Επίσης μια παρατήρηση. Καλύτερο είναι να γράφεις στα αγγλικά τις μεταβλητές και τα SQL Fields γιατί δεν υπάρχει λόγος να αναλώνεσαι στο αν το έχεις γράψει "pshfos" ή "psifos" και να πρέπει να κοιτάς ξανά και ξανά την βάση για να θυμηθείς. Επίσης ο κώδικας γίνεται πιο δυσανάγνωστος με greekglish μεταβλητές.

Δημοσ.

φιλε μου καταρχας 2 μερες το παλευο και οχι 2 ωρες και ειχα δοκιμάσει και αυτό αλλά αφού συνέχεια κανει insert 1 vote εμφανίζει όλες τις εικόνες όλων των προιοντων από όσες φορές κάνει insert τον ψήφο αφού κάνει insert (code,vode,datetime)=(get_code,1,now()).δηλαδή αν καταλαβες περιπου τη θέλω να βρο είναι κάτι σαν αυτό:

max(sum (vote) ) δηλαδη με ελληνικά το μεγαλύτερο σύνολο ψηφων ψάχνο αλλά οταν το βάζο έτσι βγάζει σφάλμα.ουσιαστικά και αυτό που μου έγραψες κάνει το ίδιο με αυτό που έγραψα και εγώ.καμιά άλλη ιδέα μήπως;

Δημοσ.

Αυτό που σου έδειξα βρίσκει το προϊόν που έχει τις περισσότερες ψήφους. Σόρρυ, αυτό κατάλαβα στην αρχή ότι θες και διάβασα και λάθος το "2 μέρες". Ήμουν σίγουρος ότι διάβασα "2 ώρες".

 

Το λάθος σου βρίσκεται στο "INSERT". Κάθε φορά που κάνει click κάποιος την φωτογραφία θα πρέπει να προσθέτεις μια ψήφο στο προϊόν όχι να κάνει INSERT οπότε εσύ πρέπει να κάνεις UPDATE και να προσθέσεις vote = vote + 1 αλλιώς θα μένουνε για πάντα όλα με '1'.

 

Θα πρέπει όμως την πρώτη φορά που φτιάχνεις ένα προϊόν να προσθέτεις και ένα entry στο pshfos table με vote = 0 οπότε μετά να κάνεις το UPDATE αλλιώς την πρώτη φορά που θα μπει ψήφος για το προϊόν θα χρειάζεται να τσεκάρεις άμα είναι πρώτη φορά που μπαίνει ψήφος και μετά να αποφασίζεις άμα θα κάνει INSERT ή UPDATE. Ο πρώτος τρόπος είναι καλύτερος γιατί γλιτώνεις 1 query αφού ξέρεις ήδη ότι υπάρχει το entry άρα, UPDATE.

 

Τέλος, αυτό εδώ που έχεις γράψει για να φέρνει τα αποτελέσματα, είναι λάθος:

 

>
select perigrafh.eikona,mαχ(vote)
from perigrafh,pshfos
where perigrafh.code=pshfos.code3
group by perigrafh.code

 

Το σωστό είναι:

 

>
SELECT perigrafh.eikona, max( vote )
FROM perigrafh, pshfos
WHERE perigrafh.code = pshfos.code3

 

Επίσης θα σου πρότεινα να χρησιμοποιήσεις το query που σου έγραψα εγώ για τα αποτελέσματα γιατί με το δικό σου κάνει full table scan η βάση, πράγμα το οποίο δεν θέλουμε.

Δημοσ.

φίλε μου αρχικά το έκανα με update αλλά επειδή θέλω να εμφανίζεται και η ημερομηνια κάθε φορά που προστήθεται ψήφος το έκανα έτσι γιατι πως αλιώς θα πρόσθετα καινουρια ημερομηνία; υπ οψην οτι την ημερομηνία την έβαλα για να βρίσκει τους ψήφους και ανα συγκεκριμένη ημερομηνια!καμια ιδέα ;αν κάνω update τον ψήφο τί θα κάνω με την ημερομηνια για να κσέρω πιος ψηφος αντιστοιχουσε σε πια ημερομηνιά;

Δημοσ.

ΟΚ, τώρα κατάλαβα ότι θες να κρατάς ΟΛΕΣ τις ψήφους. Άκυρα λοιπόν όλα.

 

Κάθε φορά που κάνει click κάποιος μια εικόνα κάνεις το INSERT σου έτσι όπως το έχεις κάνει και για να πάρεις το σωστό αποτέλεσμα κάνεις το εξής:

 

>
SELECT eikona, SUM(vote) as totalVotes
FROM pshfos 
INNER JOIN perigrafh
ON perigrafh.code = pshfos.code3
GROUP BY code
ORDER BY totalVotes DESC
LIMIT 0,1

 

To παραπάνω query δεν είναι ότι και καλύτερο (για την ακρίβεια το θεωρώ αισχρό) και θα αρχίσει να προκαλεί προβλήματα άμα μεγαλώσει πάρα πολύ η βάση. Επίσης πρόσθεσε ένα INDEX στο pshfos.code3.

 

To πιο σωστό πάντως είναι να προσθέσεις ένα INT field στο perigrafh με όνομα totalVotes και να το αυξάνεις κάθε φορά που προσθέτεις ένα vote και το query θα γίνει πολύ πιο απλό αφού μετά θα κάνεις query ένα table.

 

Άμα κάνεις την αλλαγή που σου λέω μετά πολύ απλά θα κάνεις:

 

>
SELECT eikona, MAX(totalVotes) FROM `perigrafh`

 

και τελείωσες.

 

Sorry που άργησα τόσο πολύ να καταλάβω τι θες...είμαι σε κατάσταση πανικού σήμερα με δικά μου θέματα. Ελπίζω τελικά να βοήθησα.

Δημοσ.

φιλε μου ευχαριστώ πολυ και μόνο με το λιμιτ που μου είπες να βάλω δουλεύει γιατι αφού πανε οι ψηφοι με φθηνουσα σειρά το πρωτο που εμφανίζει είναι αυτό με τους μεγαλύτερους ψήφους!

Δημοσ.

Κοίταξα πάλι το θέμα σου σήμερα που ήμουν πιο ξεκούραστος και το πιο αποδοτικό query είναι το εξής:

 

>
SELECT eikona, COUNT(*) AS totalCount
FROM perigrafh
INNER JOIN pshfos
ON perigrafh.code = pshfos.code3
GROUP BY pshfos.code3
ORDER BY totalCount DESC
LIMIT 1

 

Να ξανατονίσω ότι πρέπει να βάλεις ένα INDEX στο pshfos.code3

 

Θα σε συμβούλευα να την χρησιμοποιήσεις αν δεν πρόκειται να κάνεις την αλλαγή που πρότεινα για να είναι ακόμα πιο γρήγορο.

Δημοσ.

Θέλω να βγάζει ενα swf (width="950" height="628") σε ενα index.html που να βγαίνει τέρμα πάνω και αριστερά (χωρις κενά) σε fullscreen όπως βγαίνει και τώρα με τον κωδικα που έχω βάλει.

 

ειναι εύκολο κάποιος να μου φτιάξει τον κώδικα ωστε να γίνεται αυτό?

 

</head>

<body bgcolor="#000000">

<center>

<object

classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"

codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,79,0"

id="http://netii.net/index.swf"

width="950" height="628"

>

<param name="movie" value="http://netii.net/index.swf">

<param name="bgcolor" value="#000000">

<param name="quality" value="high" />

<param name="scale" value="noscale" />

<param name="allowscriptaccess" value="samedomain">

<embed

type="application/x-shockwave-flash"

pluginspage="http://www.macromedia.com/go/getflashplayer"

name="The_Index2"

width="950" height="628"

src="http://netii.net/index.swf"

bgcolor="#000000"

quality="high"

swliveconnect="true"

allowscriptaccess="samedomain"

>

<noembed>

</noembed>

</embed>

</object>

</center>

</body>

</html>

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...