Ongelma: Ei lähetä MySQL:ään somenewthing:iä, mutta kuitenkin pystyy
tulostamaan sen näytölle ja lähettämään sähköpostilla.
Käytän koodia PayPal IPN:ssä ja haluaisin sen lähettävän tietoa samalla kun
maksaa ostoksen, mutta jouduin kopioimaan koodin toiseen tiedostoon, että voin testata nopeammin, mutta ei lähetä somenewthing:iä MySQL:ään, mutta kuitenkin pystyy tulostamaan sen näytölle ja lähettämään sähköpostilla.
<?php require("config.php"); function sanitize($data){ $data=trim($data); $data=htmlspecialchars($data); $data=stripslashes($data); $data=mysql_real_escape_string($data); return $data; } $custom = "thething"; $message = sanitize("Server name: ".$custom."<br>"); $today = strtotime(date("Y-m-d")); $someday = strtotime(date("Y-m-d", $today) . "+1 month"); $someday2 = sanitize(date("Y-m-d",$someday)); $anotherdatequery = mysql_query("SELECT `anotherdate` FROM `somethings` WHERE `something`='$custom'"); $anotherdateresult = mysql_fetch_array($anotherdatequery); $anotherdate = sanitize($anotherdateresult[0]); if((empty($anotherdate)) || $anotherdate = "0000-00-00") { $anotherdate = date("Y-m-d"); } $someday3 = strtotime(date("Y-m-d", strtotime($anotherdate)) . "+1 month"); $somenewthing2 = mysql_fetch_array(mysql_query("SELECT `somenewthing` FROM `somethings` WHERE `something`='$custom'")); $somenewthing = sanitize($somenewthing2[0]); $onething = strtotime($anotherdate); if($onething == $today) { $onething2 = sanitize(date("Y-m-d",$someday3)); } else { $onething2 = sanitize($onething + strtotime($someday3)); } $onething3 = date("Y-m-d",$onething2); if(empty($somenewthing)) { $somenewthing = 0; } if($somenewthing == 0) { if($onething > $today) { mysql_query("UPDATE somethings SET anotherdate=$onething3, somenewthing='1' WHERE something='$custom'") or die(mysql_error()); echo "1"; } else if($onething == $today) { mysql_query("UPDATE somethings SET anotherdate=$someday2, somenewthing='1' WHERE something='$custom'") or die(mysql_error()); echo "2"; } else if($onething < $today) { mysql_query("UPDATE somethings SET anotherdate=$someday2, somenewthing='1' WHERE something='$custom'") or die(mysql_error()); echo "3"; } } else if($somenewthing == 1) { if($onething > $today) { mysql_query("UPDATE somethings SET anotherdate=$onething3 WHERE something='$custom'") or die(mysql_error()); echo "4"; } else if($onething == $today) { mysql_query("UPDATE somethings SET anotherdate=$someday2 WHERE something='$custom'") or die(mysql_error()); echo "5"; } else if($onething < $today) { mysql_query("UPDATE somethings SET anotherdate=$someday2 WHERE something='$custom'") or die(mysql_error()); echo "6"; } } ?>
Mod. lisäsi kooditagit!
Liittyneekö rivin if((empty($anotherdate)) ||$anotherdate = "0000-00-00") {
yhtäläisyysmerkkiin?
Gwaur kirjoitti:
Liittyneekö rivin
if((empty($anotherdate)) ||$anotherdate = "0000-00-00") {
yhtäläisyysmerkkiin?
Ei. Muokkasin koodia. Lisäsin uuden koodin. :)
Korjasin jo kaikki MySQL virheet, koska niitä oli kaksi.
Aikaisemmin ei pistänyt mitään MySQL:ään, mutta nyt laittaa somenewthing:n, mutta ei anotherdate:a. :(
Toi Gwaurin viesti tarkoitti, että sijoituksen $anotherdate = "0000-00-00" arvo on aina vakio ja siten koodi ei ole optimaalista. Mikäli muistan oikein, on sijoituksen arvo true ja siten ehtolauseke on aina totta, joten koko rivi on turha.
Jaska kirjoitti:
Toi Gwaurin viesti tarkoitti, että sijoituksen $anotherdate = "0000-00-00" arvo on aina vakio ja siten koodi ei ole optimaalista. Mikäli muistan oikein, on sijoituksen arvo true ja siten ehtolauseke on aina totta, joten koko rivi on turha.
Se vaan ei toiminut niin ja toimi vasta kun laitoin tuon ja Gwaur, en yhtään huomioinut, että tuossa onkin vain yksi =, mutta olen kyllä jo korjannut sen. :)
Hei, onko Ohjelmointiputka:sta korjaamaan tätä ongelmaa? :(
Jami kirjoitti:
Hei, onko Ohjelmointiputka:sta korjaamaan tätä ongelmaa? :(
Mikähän olikaan se ongelma?
Tee mielummin näin.
if(){ $sql = "UPDATE somethings SET anotherdate=$onething1, somenewthing='1' WHERE something='$custom'"; } elseif(){ $sql = "UPDATE somethings SET anotherdate=$onething2, somenewthing='1' WHERE something='$custom'"; } ... mysql_query($sql) or die(mysql_error());
Edit. Ja sitten jos viitsisit sisentää tuon koodin, niin olisi helpompi lukea.
Lebe80 kirjoitti:
Jami kirjoitti:
Hei, onko Ohjelmointiputka:sta korjaamaan tätä ongelmaa? :(
Mikähän olikaan se ongelma?
Ongelma on se, että ei kirjoita MySQL:ään somenewthing:iä. :(
Macro kirjoitti:
dartvaneri kirjoitti:
Tee mielummin näin.
...
Ajattelinkin, että ei kannattaisi tehdä, koska jos se onkin tietoturvaaukko. :)
Macro kirjoitti:
Jahas ja miksi? En itse näe mitään eroa tietoturvan kannalta tuohon alkuperäiseen verrattuna, toki ei minulla ole kokemusta MqSQL:stä, vain PDO:ta käyttänyt.
Jos haluaa käyttää mysql_-alkuisia funktioita tietokantakyselyissä, niin kyselyiden käyttäjän antamat arvot täytyy ajaa mysql_real_escape_string-funktion läpi, koska muuten sekin on SQL-injektioaukko.
Macro kirjoitti:
Jos haluaa käyttää mysql_-alkuisia funktioita tietokantakyselyissä, niin kyselyiden käyttäjän antamat arvot täytyy ajaa mysql_real_escape_string-funktion läpi, koska muuten sekin on SQL-injektioaukko.
Totta tuokin..
Käytän tälläistä:
function sanitize($data){ $data=trim($data); $data=htmlspecialchars($data); $data=stripslashes($data); $data=mysql_real_escape_string($data); return $data;
Kannattaa laittaa tollaset htmlspecialchars-funktiot vasta tulostuksen yhteyteen, koska <- ja >-tagit häiritsevät tietokannassa datan käsittelyä.
Käytät tuota sanitize()-funktiotasi aivan väärin. Et voi hakea tietokannasta riviä, sen jälkeen ajaa sen arvoja stripslashesin läpi ja sitten kirjoittaa arvoja takaisin kantaan. Tällöin kirjoittamasi tieto voi olla eri tieto kuin mitä olet kannasta lukenut, eli toisin sanoen tiedot ovat korruptoituneita. Vieläkin heikommilla olet, josset ymmärrä, mitä olet tekemässä, vaan "kaiken varalta" kutsut satunnaisia funktioita sattumanvaraisesti.
Macro kirjoitti:
Jos haluaa käyttää mysql_-alkuisia funktioita tietokantakyselyissä, niin kyselyiden käyttäjän antamat arvot täytyy ajaa mysql_real_escape_string-funktion läpi, koska muuten sekin on SQL-injektioaukko.
Sillä, mitä funkkareita SQL-kyselyiden ajamiseen käyttää, ei ole mitään väliä, jos kyselyt on konstruoitu kuten tuossa esimerkissä. Mitä tahansa tapaa käyttäessä kyselyt ovat rikkinäisiä ja mahdollistavat samat hyökkäykset.
Tiedän kyllä mitä olen tekemässä, en käytä sanitize()-funktiota kuin rekisteröitymisessä ja muokkaamisessa, mutta testasin vain tapahtuuko mitään käyttämällä sanitize()-funktiota muissakin paikoissa. Kiitos kuitenkin vastauksista. :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.