Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Ongelma MySQL queryn kanssa PHP:n IF väittämien sisällä!

Sivun loppuun

Jami [01.08.2012 19:41:09]

#

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!

Gwaur [01.08.2012 19:47:03]

#

Liittyneekö rivin if((empty($anotherdate)) ||$anotherdate = "0000-00-00") { yhtäläisyysmerkkiin?

Jami [01.08.2012 20:11:33]

#

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. :(

Jaska [01.08.2012 20:51:27]

#

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.

Jami [01.08.2012 20:58:46]

#

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. :)

Jami [03.08.2012 10:18:20]

#

Hei, onko Ohjelmointiputka:sta korjaamaan tätä ongelmaa? :(

Lebe80 [03.08.2012 10:39:06]

#

Jami kirjoitti:

Hei, onko Ohjelmointiputka:sta korjaamaan tätä ongelmaa? :(

Mikähän olikaan se ongelma?

dartvaneri [03.08.2012 11:14:09]

#

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.

Macro [03.08.2012 11:31:23]

#

dartvaneri kirjoitti:

Tee mielummin näin.

...

Älä tee.

Jami [03.08.2012 11:41:36]

#

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.

...

Älä tee.

Ajattelinkin, että ei kannattaisi tehdä, koska jos se onkin tietoturvaaukko. :)

dartvaneri [03.08.2012 11:46:16]

#

Macro kirjoitti:

Älä tee.

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.

Macro [03.08.2012 15:27:37]

#

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.

dartvaneri [03.08.2012 16:43:42]

#

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..

Jami [03.08.2012 16:51:27]

#

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;

Macro [03.08.2012 17:40:16]

#

Kannattaa laittaa tollaset htmlspecialchars-funktiot vasta tulostuksen yhteyteen, koska &lt- ja &gt-tagit häiritsevät tietokannassa datan käsittelyä.

The Alchemist [03.08.2012 19:44:33]

#

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.

Jami [03.08.2012 21:39:59]

#

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. :)


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta