Eli ongelmani on (ainakin) seuraavanlainen. Kyseessä on tietokanta scripti jolla tulisi voida muokata tietueita (funktiot niitä varten). Homma näyttäsi toimiva eli menee muokkaus, poisto ym. tiloihin mutta ei tee mitään muutoksia/lisäyksiä tietokantaan...
<style type="text/css"> h2 { border-top: solid thin black; color:#000;background-color:#fed } h3 { border-top: solid thin black; color:#000;background-color:#eee } </style> </head> <?php // osoitekirja.php //include 'funktiot.php'; //error_reporting(0); /****************************************************/ function query($kysely) { global $yhteys; return mysql_query($kysely, $yhteys); } /***********************************************/ // Navigointivalikko function lomake($sn) { ?> <form method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>" <a href="'$_SERVER['PHP_SELF']'"> <?php echo ("<a href=\"" . $_SERVER['PHP_SELF'] . "?t="); echo (time() . "\">"); echo ("Näytä kaikki osoitteet</a> | "); echo ("<a href=\"" . $_SERVER['PHP_SELF'] . "?t="); echo (time() . "&action=Lisaa\">"); echo ("Lisää osoite</a>\n <br>"); ?> Etsi sukunimen tai sen osan perusteella: <input type="text" name="snimi_form" value= "<?php if(isset($sn)) echo htmlspecialchars($sn) ?>"> <input type="submit" value="Hae!"> </form> <?php echo "<h2>Osoitekirja</h2>\n"; } /***********************************************/ function sql_tulokset_taulukkoon($tulos) { /*Kyselyn tuloksen rivien ja sarakkeidem lkm.*/ $riveja = mysql_num_rows($tulos); $sarakkeita = mysql_num_fields($tulos); echo "<em>Muokkaa valitsemalla tunnus<em>"; echo "<table border =\"1\">\n"; /*Tulostetaan otsikot ensimmäiselle riville */ echo "<tr>\n"; for($i=0; $i<$sarakkeita; $i++) { printf("<td bgcolor=\" #ffeedd\"> %s </td>\n", mysql_field_name($tulos, $i)); } echo "</tr>"; /* Käydään tulosjoukon kaikki rivit ja sarakkeet läpi /* mysql_result hakee $j:n ja $i:n määräämän tietueen */ for($j=0; $j<$riveja; $j++) { echo "<tr bgcolor=" . anna_vari() . ">\n"; for($i=0; $i<$sarakkeita; $i++) { /* Hyperlinkin "id-kentän" arvoksi tulosteaan /* tunnuskentän arvo mahdollista käsittelyä varten */ if($i==0) { printf ("<td><a href=\"" . $_SERVER['PHP_SELF'] . "?action=Muokkaa"); printf("&tt=" . time() . "&id="); printf("%s\">%s</a></td>\n", rawurlencode(mysql_result($tulos, $j,$i)), htmlspecialchars(mysql_result($tulos, $j,$i))) ; } else { printf("<td>%s</td>\n", htmlspecialchars(mysql_result($tulos, $j,$i))); } } echo "</tr>"; } echo "</table>"; } /***********************************************/ function anna_vari() { static $varikoodi; if($varikoodi== "#eeeeee") { $varikoodi= "#ffffff"; } else { $varikoodi= "#eeeeee"; } return ($varikoodi); } /****************************************************/ /* Tutkitaan päivitetäänkö olemassa olevaa tietuetta */ function on_paivitys($id) { if(strlen($id) > 0) { return TRUE; } else { return FALSE; } } /****************************************************/ /* muokkauslomaketta käytetään sekä uuden tietueen, */ /* että vanhojen tietueiden muokkaamiseen ja */ /* poistamiseen */ function muokkauslomake($tulos, $id) { $sarakkeita = mysql_num_fields($tulos); echo "<em> Lisää/ Muokkaa osoite <em>"; ?> <form method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>" <?php echo "<table border =\"1\">\n"; for($i=0; $i<$sarakkeita; $i++) { $fn=mysql_field_name($tulos, $i); $fv=@mysql_result($tulos, 0,$i); echo ("<tr valign=\"top\">\n"); echo ("<td align=\"right\" bgcolor=\"#ffeedd\">"); echo (ucfirst($fn) . "</td>\n"); echo ("<td bgcolor=\"#dddddd\">"); /* Päivitettäessä tietuetta avainkenttää /* ($i==0) ei voi muokata */ if(on_paivitys($id) AND ($i==0)) { echo (htmlspecialchars($fv)); echo ("<input type=\"hidden\" name=\"$fn\""); echo (" value=\""); echo (htmlspecialchars($fv). "\">"); } else { echo ("<input type=\"text\" name=\"$fn\""); echo (" size=\"30\""); echo (" value=\""); echo (htmlspecialchars($fv) ."\">"); echo("<br>\n"); } echo("</td>\n</tr>\n"); echo("</table>\n"); } echo (painikkeet($id)); echo ("</form>"); } /****************************************************/ function painikkeet($id) { if(on_paivitys($id)) { // Seurattu linkkiä -> $id mukana -> halutaan muokata $mjono = "<input type=\"submit\" name=\"action\" "; $mjono .= "value=\"Tallenna muutokset\" "; $mjono .= "onclick=\"javascript: "; $mjono .= "return confirm('Hyväksy muutokset?')\">\n "; $mjono .= "<input type=\"submit\" name=\"action\" "; $mjono .= "value=\"Poista\" onclick=\"javascript: "; $mjono .= "return confirm('Hyväksy poisto?')\">\n "; } else { // Uuden tietueen syöttäminen $mjono = "<input type=\"submit\" "; $mjono .= "name=\"action\" value=\"Tallenna\" "; $mjono .= "onclick=\" javascript: "; $mjono .= "return confirm('Hyväksy lisäys?')\"><br>\n "; } return $mjono; } /****************************************************/ function hae_muokattava_data($id) { /* Lisättäessä uutta tietuetta */ $id=addslashes($id); $kysely="SELECT * FROM henkilot WHERE tunnus= '$id'"; $tulos=query($kysely); if($tulos) { muokkauslomake($tulos, $id); } } /****************************************************/ function listaa_henkilot($sukunimi) { if(isset($_POST['snimi_form'])) { /*Lähetetään kyselyn mukaiset tiedot lomakkelta*/ $_POST['snimi_form'] =addslashes($_POST['snimi_form']); $kysely = "SELECT tunnus, sukunimi, etunimi, email"; $kysely .= " FROM henkilot WHERE sukunimi"; $kysely .= " LIKE '%".$_POST['snimi_form']."%'"; } else { $kysely = "SELECT tunnus, sukunimi, etunimi, email"; $kysely .= " FROM henkilot"; } $tulos=query($kysely); if(!$tulos) { echo "Kyselyssä tapahtui virhe!"; exit; } sql_tulokset_taulukkoon($tulos); } /****************************************************/ function lisaa_uusi_tietue($tunnus, $sukunimi, $etunimi, $osoite, $puhnumero, $email) { // tarkista_syotteet($tunnus, $sukunimi, $etunimi, // $osoite, $puhnumero, $email); $sql= "INSERT INTO henkilot VALUES ( '$tunnus', '$sukunimi', '$etunimi', '$osoite', '$puhnumero', '$email' )"; $tulos= query($sql); } /****************************************************/ function paivita_tietue($tunnus, $sukunimi, $etunimi, $osoite, $puhnumero, $email) { $sql = "UPDATE henkilot SET sukunimi='$sukunimi', etunimi='$etunimi', osoite='$osoite', puhnumero='$puhnumero', $email='$email' WHERE tunnus='$tunnus'"; $tulos= query($sql); } /****************************************************/ function poista_tietue($tunnus) { $tunnus=addslashes($tunnus); $sql="DELETE FORM henkilot WHERE tunnus=$tunnus"; $tulos= query($sql); if(!$tulos) { echo "Kyselyssä tapahtui virhe!"; exit; } } /********* Pääohjelma ***************************************/ //muodostetaan yhteys tietokantapalvelimeen $yhteys = mysql_connect("localhost","root") or die("Yhdistäminen ei onnistunut!" . mysql_error()); if(isset($yhteys)) { echo "SQL yhteys saatu!"; } //valitaan tietokanta "osoitteet" mysql_select_db("osoitteet", $yhteys) or die("Tietokantaa ei löytynyt!"); if(!isset($_POST['snimi_form'])) $_POST['snimi_form'] = ""; lomake($_POST['snimi_form']); switch($_GET['action']) { case "Muokkaa": hae_muokattava_data($_GET['id']); break; case "Lisaa": hae_muokattava_data($_GET['id']); break; case "Tallenna": lisaa_uusi_tietue($_GET['tunnus'], $sukunimi, $etunimi, $osoite, $puhnumero, $email); case "Tallenna muutokset": paivita_tietue($_GET['tunnus'], $_GET['sukunimi'], $etunimi, $osoite, $puhnumero, $email); break; case "Poista": poista_tietue($_POST['tunnus']); break; default: listaa_henkilot($_POST['snimi_form']); } ?>
Olisit voinut jatkaa edellisessä aiheessasi. Heitin myös tonne kolmanteen aiheeseen aimo kasan parannusehdotuksia. Tästä sen verran lisää, että eikö tuo query-funkkari ole melko turha, yhden rivin koodi korvataan monella rivillä.
Kiitti tsuriga vastauksesta. Ei vaan pelitä edellenkään, enkä keksi syytä=(
En saa toimimaan . Voisko joku autaa... Kiitos etukäteen
Oletko jo tarkistanut että noile alifunktioillesi välittyvät parametrit oikein?
lapm kirjoitti:
Oletko jo tarkistanut että noile alifunktioillesi välittyvät parametrit oikein?
Niin siinä kait se vika varmaan onkin=( en vaan tiedä miten ne tarkistettaisiin. Esimerkiksi seuraava funktio ei tulosta mitään
function poista_tietue($id) { $id=addslashes($id); $sql="DELETE FROM henkilot WHERE tunnus='$id'"; $tulos= query($sql); if(mysql_affected_rows($tulos) > 0) { echo "Tietue poistetiin onnistuneesti\n"; } else { echo "Tietueen poistaminen ei onnistunut\n <br>"; } }
Voisitko vääntää rautalangasta. Kiitos
harma kirjoitti:
en vaan tiedä miten ne tarkistettaisiin.
Tulostamalla niitten arvot?
Joo kyllä minä nitä olen yrittänyt echo:lla tulostaakin. Ongelma on, että ainakaan funktiosta function poista_tietue($id) ei tulostu mitään ei edes echo "Tietueen poistaminen ei onnistunut\n. Näyttäsi aivan kuin "ohjelma" ei edes kävisi koko funktiossa...
ilmeisesti function painikkeet($id)ei aseta muutujalle action mitään arvoa, joten tällöin ei koko funktiota function poista_tietue($id) käydä ollenkaan... Voisko joku auttaa
debuggia peliin
eli echoa funktioiden sisällä ja funktioiden ulkoa ja vertaile tuloksia. Copy/pastea muuttujien nimiä mahdollisten kirjoitusvirheiden takia yms. Tarkkaile selaimen javaScript konsolia virheellisten javaScriptien toivossa yms.
EDIT: PHP ei näköjään ole kovinkaan tarkka näkyvyysalueiden kanssa. Kannattaa kuitenkin esitellä muuttujat aina ylemmissä lohkoissa, muissa kielissä (esim. Java) tämä voi olla oleellista.
Ongelmana voipi olla muuttujien näkyvyysalueet. Elikkäs
<?php function painikkeet($id) { /** * $mjono-muuttuja pitäisi esitellä tässä, koska muuten se * ei näy funktio-lohkolle, vain if- ja else-lohkoille * esim. $mjono = ""; */ if(on_paivitys($id)) $mjono = "jotain"; else $mjono = "jotain muuta"; return $mjono; } ?>
Ps. koodia saa siistimmäksi kun otat echoista sulut pois ja aloitat ja lopetat merkkijonojen merkkaukset heitto-, ei lainausmerkillä. Rivinvaihdoissa tosin käytä lainausmerkkejä. Esim. echo '<input type="text" name="test" />'."\n". Miten lystää, eipähän näy ylimääräisiä \-merkkejä rivien keskellä.
Kiiti tsuriga avusta, mutta ei auttanut=( Minäpä koitan siistiä vähän koodia.. Jos vielä voisit auttaa...
Tarkistat tuon action:n GET-taulukosta vaikka lomake lähetetään POST-metodilla. Tietojen hakeminen lomakkeisiin onnistuu todennäköisesti sen takia että silloin action-muuttuja tulee URL:sta. Laita jokin tarkistus tuon switch rakenteen eteen tai sitten muutat lomakkeiden rakennetta.
Lisäksi koodissasi on tälläisia hieman epäloogia kohtia.
Jos switch-rakenteeseen vaihtaa switch($_POST['action']) GET:in tilalle lopettaa kokonaan toimimasta. Liekö vika sitten FORM:eissa?
Kyllähän tuon nyt on pakko jotain tulostaa koska tuossa on tuo default-kohta.
Lähinnä tarkoitin sitä että laitat siihen jotain tyyliin
if( isset(_POST action ) ) action = _POST action elseif( isset(_GET action ) ) action = _GET action else action = '';
Ja sitten tuo jatko
switch( $action ) ...
$_POST ja $_GET löytyy yhdessä $_REQUEST-taulukosta, mikäli tässä nyt tahdotaan, että tietojen lähettäminen on mahdollista sekä osoiteriviltä, että sivupyynnöllä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.