Ik combineer preg_match met string escapen. Overbeveiliging.quote:Op vrijdag 6 januari 2012 01:50 schreef KomtTijd... het volgende:
Ik weet wat preg_match is.
Maar als tientallen mensen die jarenlang gestudeerd hebben op SQL injectie een functie maken die dagelijks door duizenden kwaadwillende mensen beproefd wordt, om alle mogelijke manieren van SQL injectie te voorkomen, maar jij denkt dat je het beter kunt met een preg_match, ben je wel redelijk naief.
1 2 3 4 5 6 | <?php $str = "Is your name O'reilly?"; // Outputs: Is your name O\'reilly? echo addslashes($str); ?> |
Dat dus!quote:Op vrijdag 6 januari 2012 10:34 schreef Scorpie het volgende:
Bij SQL queries http://php.net/manual/en/function.mysql-real-escape-string.php
Die zag ik idd voorbij komen.quote:Op vrijdag 6 januari 2012 10:31 schreef Pakspul het volgende:
[ code verwijderd ]
Bron: http://php.net/manual/en/function.addslashes.php
quote:Op vrijdag 6 januari 2012 10:34 schreef Scorpie het volgende:
Bij SQL queries http://php.net/manual/en/function.mysql-real-escape-string.php
quote:
quote:A MySQL connection is required before using mysql_real_escape_string() otherwise an error of level E_WARNING is generated, and FALSE is returned.
1 | trailer='o\'' |
1 | quoted string not properly terminated |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | SQL> SELECT 'Frank''s Oracle site' AS text FROM DUAL; TEXT -------------------- Franks's Oracle site SQL> SELECT 'A ''quoted'' word.' AS text FROM DUAL; TEXT ---------------- A 'quoted' word. SQL> SELECT 'A ''''double quoted'''' word.' AS text FROM DUAL; TEXT ------------------------- A ''double quoted'' word. |
1 2 3 4 | <?php // hopelijk is het zichtbaar dat een enkele quote wordt vervangen door twee enkele quotes. $name = str_replace("'", "''", "Frank's Oracle site"); ?> |
1 | trailer='".$trailer."' |
Oracle heeft Mysql gekocht rememberquote:
En als je " (dubbele quote) naar " veranderd en ' (enkele quote) naar 'quote:Op vrijdag 6 januari 2012 11:20 schreef Cue_ het volgende:
Een str_replace (en wss ook die addslashes) werken niet omdat het bij verwerking in quotes komt te staan
[ code verwijderd ]
SPOILEROm spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.
quote:Op vrijdag 6 januari 2012 21:18 schreef Geflipte-Koelkast het volgende:
Het is me al gelukt. Op de 1 of andere manier het oude script aan de praat gekregen. Alleen nog 1 vraag. Als ik op verzenden klik, wat moet er dan verandert worden in het script, om hem door te sturen naar de 'bedank' pagina?Een header toevoegen naar je bedank pagina nadat de mail succesvol is verzonden.SPOILEROm spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.Ik weet niks van Hindoes. Wel van Samoerai en andere dingen.
Ik heb wat basic tutorials doorgenomen,quote:Op vrijdag 6 januari 2012 22:16 schreef Catch22- het volgende:
zo werkt het niet. Ik zou even wat basic tutorials php lezen en ook even wat debug-tutorials doornemen.
Maar die code he, daar staat regel voor regel wat er gebeurt...
quote:Op vrijdag 6 januari 2012 21:18 schreef Geflipte-Koelkast het volgende:
Het is me al gelukt. Op de 1 of andere manier het oude script aan de praat gekregen. Alleen nog 1 vraag. Als ik op verzenden klik, wat moet er dan verandert worden in het script, om hem door te sturen naar de 'bedank' pagina?SPOILEROm spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.Er is een reden dat register_globals niet meer gebruikt moet worden. Dan moet je niet zelf dat gedrag proberen na te bootsen.
1
2
3
4
5
6
7
8
9
10
11
12<?php
// Emular register_globals on
if (!ini_get('register_globals')) {
$superglobales = array($_SERVER, $_ENV, $_FILES, $_COOKIE, $_POST, $_GET);
if (isset($_SESSION)) {
array_unshift($superglobales, $_SESSION);
}
foreach ($superglobales as $superglobal) {
extract($superglobal, EXTR_SKIP);
}
}
?>
1 2 3 4 | A = 2 likes B = 3 likes C = 4 likes D = 1 like |
1 2 3 4 | 1. C 2. B 3. A 4. D |
Wat voor melding geeft het? en heb je die melding door google heen gehaalt?quote:Op vrijdag 6 januari 2012 23:50 schreef Vanillax het volgende:
[..]
Ik heb wat basic tutorials doorgenomen,
En dus de tutorial gevolgd waarvan ik die link gaf maar het werkt dus niet.
En ik snap niet waarom.
Dus ik begin me af te vragen of het niet gewoon aan de host ligt ipv aan mijn php skills, want ik doe gewoon letterlijk wat er in die tutorial staat..
Nee likes staan in mijn eigen database, en wat jij wilt gaat niet lukkenquote:Op zondag 8 januari 2012 20:57 schreef cablegunmaster het volgende:
Easy... een order by in je query's gebruiken de vraag blijft of dit mogelijk is.
Want volgens mij gebruik je hierbij de facebook API? applicatie? ?
Corrigeer me als ik het verkeerd heb.
anders een query maken;
Select * from TABLE order by aantal_likes desc
of hoe je het veld hebt genoemd .
Zie voorbeeld:
http://www.w3schools.com/php/php_mysql_order_by.asp
[..]
Wat voor melding geeft het? en heb je die melding door google heen gehaald?
Hoe haal je de gegevens van A uit de database zijnde van wat erbij hoort? Dus bijvoorbeeld de rest van de pagina? want dan is het een kwestie van een variabele query.quote:Op zondag 8 januari 2012 21:15 schreef dirkjo het volgende:
[..]
Nee likes staan in mijn eigen database, en wat jij wilt gaat niet lukken
Want op die pagina wil ik niet de complete lijst, maar alleen de positie van het ene element (A in dit geval) uit de lijst. Snap je?
Oke stel je dit voor:quote:Op zondag 8 januari 2012 21:32 schreef cablegunmaster het volgende:
[..]
Hoe haal je de gegevens van A uit de database zijnde van wat erbij hoort? Dus bijvoorbeeld de rest van de pagina? want dan is het een kwestie van een variabele query.
"select * from likes where id = ' ".esc($_GET['id'])." ' ";
Met bvb de link index.php?id=50 dan haalt hij de ID eruit van 50 en welke ABCD er bij hoort.
1 2 3 4 | A = 3 likes B = 2 likes C = 4 likes D = 1 like |
Dus je wil dat de site tegen je zegt Dit nieuwsartikel of letter A Staat op nummer 2 van de hele lijst. en de rest negeren? Dan zou ik een order by desc. doen en vervolgens het eruit halen met echo. een Getal++; in de for lus doen (of welke lus) en als het overeen komt welke positie het is dus als de id te voorschijn komt die nodig is dan laat je het pas Echo'en welke positie het is.quote:Op zondag 8 januari 2012 21:42 schreef dirkjo het volgende:
[..]
Oke stel je dit voor:
Je hebt de waardes A, B, C en D zoals ik net al zei. Buiten nog veel meer informatie staat er onder andere in de database bij elke waarde (elke rij dus) het aantal likes dat die heeft gekregen (facebook onafhankelijk).
Als ik een lijst wil maken waarbij de waarde met de meeste likes bovenaan komt te staan kan ik inderdaad ORDER BY likes DESC gebruiken, maar dit wil ik niet.
Ik wil namelijk het volgende:
Elke waarde is ook een pagina, stel je voor A heeft ID 1; dan heb ik een waarde met ID 1. Dan kan ik alle waardes van die row pakken door WHERE ID = 1 te gebruiken, waaronder dus ook de likes.
Maar dat heeft allemaal niks te maken met wat ik wil. Ik wil namelijk op die pagina van 'A' dat je kan zien waar 'A' staat in de lijst (dus de lijst waar de meeste likes bovenaan staan).
Ik wil dat mysql dan aan mij teruggeeft op welke plek A zou staan als ik alle waardes sorteer van meeste naar minste likes.
Dus als voorbeeld:
[ code verwijderd ]
Als ik nu de hele lijst zou plaatsen zou 'A' op nummer twee worden geplaatst, hij heeft tenslotte de op een na meeste likes.
Nu wil ik op de pagina van 'A' die plaatst (positie 2) dus laten zien ZONDER de hele zooi te moeten plaatsen.
Ik hoop hiermee een beetje duidelijk te hebben beschreven wat ik wil?
Je snapt hetquote:Op zondag 8 januari 2012 22:20 schreef cablegunmaster het volgende:
[..]
Dus je wil dat de site tegen je zegt Dit nieuwsartikel of letter A Staat op nummer 2 van de hele lijst. en de rest negeren? Dan zou ik een order by desc. doen en vervolgens het eruit halen met echo. een Getal++; in de for lus doen (of welke lus) en als het overeen komt welke positie het is dus als de id te voorschijn komt die nodig is dan laat je het pas Echo'en welke positie het is.
Voila? of snap ik het verkeerd ?
Dan krijg je als resultaat : A staat op X positie en heeft 4 likes.
Positie moet altijd up-to-date blijven omdat users hem kunnen bepalen (door middel van de likes).quote:Op zondag 8 januari 2012 22:37 schreef GlowMouse het volgende:
Select count(*) op de rijen met meer likes als het aantal rijen klein is, anders denormaliseren en de positie ook in de rij opslaan
1 2 3 4 5 6 7 8 9 10 11 12 | <?php function songRank($songID){ $rank = 0; $getrank = mysql_query("SELECT songID FROM songs ORDER BY `likes` DESC"); while($row = mysql_fetch_array($getrank)){ $rank++; if($songID == $row['songID']){ return $rank; } } } ?> |
Nog nooit gebruik gemaakt van COUNT(*), maar ik zal er eens naar kijken.quote:Op zondag 8 januari 2012 22:48 schreef GlowMouse het volgende:
Dat is een domme query, net alsof je niet snapt wat COUNT(*) en WHERE doen.
quote:Op zondag 8 januari 2012 22:50 schreef dirkjo het volgende:
[..]
Nog nooit gebruik gemaakt van COUNT(*), maar ik zal er eens naar kijken.
1 | SELECT COUNT(*) AS aantal FROM songs WHERE songID = '" . mysql_real_escape_string($songID) . "' ORDER BY `likes` DESC |
songID is nummeriek, maar je query geeft geen positie terug. Ik krijg overal '1' terugquote:Op zondag 8 januari 2012 22:52 schreef The_Terminator het volgende:
[..]
[ code verwijderd ]
Het aantal zit dan in: $row['aantal']
Edit: is songID numeriek of een string?
Oeps... Onderstaande fixt het:quote:Op zondag 8 januari 2012 22:56 schreef dirkjo het volgende:
[..]
songID is nummeriek, maar je query geeft geen positie terug. Ik krijg overal '1' terug
1 | SELECT COUNT(*) AS aantal, songID FROM songs WHERE songID = " . mysql_real_escape_string($songID) . " ORDER BY `likes` DESC |
Nee hoorquote:Op zondag 8 januari 2012 22:58 schreef The_Terminator het volgende:
[..]
Oeps... Onderstaande fixt het:
[ code verwijderd ]
Geen rijen, maar één kolom in een rij. (Ja ik weet; dat heb ik een paar keer verkeerd gezegd zie ik net ).quote:Op zondag 8 januari 2012 23:02 schreef GlowMouse het volgende:
Welke rijen moet je tellen om de rank te bepalen.
Daarom vroeg ik of songid een numerieke waarde zou zijn. Ik gebruikt meestal is_numeric om te bepalen of de ingevoerde waarde ook daadwerkelijk numeriek is en als dat zo is voer ik het aan de query zonder de escape_string functie te gebruiken. En ik heb een vermoeden dat ik in mijn query een group by ben vergetenquote:Op zondag 8 januari 2012 23:04 schreef GlowMouse het volgende:
De oplossing van T_T is alleen daarom al niet goed omdat hij mysql_real_escape_string en intval door elkaar haalt.
Of niet, want je weet toch al dat dat precies één rij is. Je wilt juist tellen hoeveel rijen een hogere score hebben. Je functie zou dus "songRank($likes)" moeten zijn.quote:Op zondag 8 januari 2012 23:06 schreef dirkjo het volgende:
[..]
De kolom 'likes' vertelt me de positie, die kolom bevat een getal. Met COUNT ga je alle rijen tellen die `songID` '$songID' bevatten, ofniet?
Probeer het niet goed te praten . Je stopt output van mysql_real_escape_string in een query zonder quotes om die output en dat is onveilig.quote:Op zondag 8 januari 2012 23:07 schreef The_Terminator het volgende:
[..]
Daarom vroeg ik of songid een numerieke waarde zou zijn. Ik gebruikt meestal is_numeric om te bepalen of de ingevoerde waarde ook daadwerkelijk numeriek is en als dat zo is voer ik het aan de query zonder de escape_string functie te gebruiken. En ik heb een vermoeden dat ik in mijn query een group by ben vergeten
Maar wat gebeurd er dan als meerdere nummers hetzelfde aantal likes hebben? Dan pakt die de eerste de beste rij die het gegeven aantal likes heeft.quote:Op zondag 8 januari 2012 23:13 schreef GlowMouse het volgende:
[..]
Of niet, want je weet toch al dat dat precies één rij is. Je wilt juist tellen hoeveel rijen een hogere score hebben. Je functie zou dus "songRank($likes)" moeten zijn.
[..]
Probeer het niet goed te praten . Je stopt output van mysql_real_escape_string in een query zonder quotes om die output en dat is onveilig.
Ik probeer niets goed te praten . Ik ben vergeten die escapefunctie te verwijderen, de quotes had ik wel weggehaald waardoor het lijkt dat ik de functie gebruik in een query zonder quotes.quote:Op zondag 8 januari 2012 23:13 schreef GlowMouse het volgende:
Probeer het niet goed te praten . Je stopt output van mysql_real_escape_string in een query zonder quotes om die output en dat is onveilig.
Heb je die vraag eens bij je eigen query gesteld?quote:Op zondag 8 januari 2012 23:23 schreef dirkjo het volgende:
[..]
Maar wat gebeurd er dan als meerdere nummers hetzelfde aantal likes hebben? Dan pakt die de eerste de beste rij die het gegeven aantal likes heeft.
Jazeker, maar als ik mijn manier gebruik garandeer ik wel dat de plek die de pagina over het nummer aangeeft gelijk is aan de plek die staat in de pagina waar de complete lijst van alle nummers staat.quote:Op zondag 8 januari 2012 23:25 schreef GlowMouse het volgende:
[..]
Heb je die vraag eens bij je eigen query gesteld?
Ik definieer de plek als 1+[het aantal songs met meer likes]. Het aantal songs met meer likes kun je met één query tellen.
Dat is niet waar, het resultaat berust op toeval.quote:Op zondag 8 januari 2012 23:27 schreef dirkjo het volgende:
[..]
Jazeker, maar als ik mijn manier gebruik garandeer ik wel dat de plek die de pagina over het nummer aangeeft gelijk is aan de plek die staat in de pagina waar de complete lijst van alle nummers staat.
quote:Op zondag 8 januari 2012 23:30 schreef dirkjo het volgende:
En dat zou het niet doen in jouw geval, of valt zoiets niet te vermijden?
quote:Op zondag 8 januari 2012 23:25 schreef GlowMouse het volgende:
[..]
Ik definieer de plek als 1+[het aantal songs met meer likes]. Het aantal songs met meer likes kun je met één query tellen.
Oke, dus (even snel) zou jouw query er ongeveer zo uitzien:quote:
1 2 3 | <?php mysql_query("SELECT COUNT(*) AS rank FROM songs WHERE likes > ". $likes. " "); ?> |
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |