Olen tehnyt alla olevan scriptin jonka toimintaa yritän kertoa. Ongelma liittynee kohtaan (function lomake($_SERVER['PHP_SELF'], $sn)). Käytin aluksi muuttujaa $_PHP_SELF jolloin san herjan, että muuttujaa ei tunneta. Sain ohjelman menemään selaimen läpi vaihtamalla muuttujan globaaliksi...mutta Ohjelma tulosti kaikki tietokannan tiedot, mutta formilla tapahtunut kysely ei toiminut (eikä toimi). Muuttujan vaihdon jälkeen selain antaa vaan virheilmoituksen Parse error kohdassa (function lomake($_SERVER ['PHP_SELF'], $sn)).
<?php function sql_tulokset_taulukkoon($tulos) { /*Kyselyn tuloksen rivien ja sarakkeidem lkm.*/ $riveja = mysql_num_rows($tulos); $sarakkeita = mysql_num_fields($tulos); 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>"); for($j=0; $j<$riveja; $j++) { echo ("</tr>\n"); for($i=0; $i<$sarakkeita; $i++) { printf("<td>%s</td>\n", mysql_result($tulos, $j,$i)); } echo ("</tr>"); } echo ("</table>"); } function lomake($_SERVER['PHP_SELF'], $sn) { ?> <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" Etsi sukunimen tai sen osan perusteella: <br> <input type="text" name="snimi_form" value= '"<?php if(isset($sn)) echo htmlspecialchars($sn) ?>"'> <input type="submit" value="Hae!"> </form> <?php } /********* 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($snimi_form)) { /*Lähetetään kyselyn mukaiset tiedot lomakkelta*/ $snimi_form =addslashes($snimi_form); $kysely = "SELECT sukunimi"; $kysely .= "FROM henkilot WHERE sukunimi, etunimi, email"; $kysely .= "LIKE '%$snimi_form%'"; } else { $kysely = "SELECT *"; //sukunimi, etunimi, email"; $kysely .= "FROM henkilot"; } $tulos=mysql_query($kysely, $yhteys) or die("\n\rVirhe kyselyssä!". mysql_error()); if(!$kysely) { echo "Kyselyssä tapahtui virhe!"; exit; } lomake($_SERVER['PHP_SELF'] , $snimi_form); sql_tulokset_taulukkoon($tulos); ?>
function lomake($_SERVER['PHP_SELF'], $sn)
->
function lomake($sn)
$_SERVER muuttuja on globaali, sitä ei tarvitse erikseen antaa funktiolle muuttujan kautta, eikä funktiot syö taulukon tiettyä solua muuttujana.
Kiitos T.M
Tein kuten sanoit Nyt antoi uuden virheilmoituksen
Notice: Undefined variable: snimi_form in c:\program files\easyphp1-8\www\my_sql_002.php on line 91
Vieläkö jaksaisit tutkia? Kiitos
Tuot lomakkeelta tietoja, joten kaikki lomakkeen muuttujat löytyvät $_POST taulukosta: $_POST['snimi_form']
Sorry nyt meni yli... Mitä minun pitäisi muuttaa? Toivottavasti jaksat vielä vaivautua
Register_globals on (onneksi) pois päältä, eli tuota ei saa suoraan muuttujasta ($snimi_form) vaan _post:n sisältä ($_POST['snimi_form']).
Vaihdoin funktion kutsuksi lomake($_POST['snimi_form']); mutta ei pelitä vieläkään. Tulostaa koko ajan vaan koko tietokannan... Vieläkö vaivaudut. Olisi iso asia!
Muuta $snimi_form -> $_POST['snimi_form'].
Vaihdoin jo funktio kutsun, mutta ei pelitä. Näyttäsi, että ohjelma ei koskaan käy "if(isset($snimi_form))" osaa läpi vaan hyppää "else" osaan vaikka nappia on painettu...
harma kirjoitti:
Näyttäsi, että ohjelma ei koskaan käy "if(isset($snimi_form))" osaa läpi vaan hyppää "else" osaan vaikka nappia on painettu...
No mutta ainakaan tuossa koodissa et sille ($snimi_form -muuttujalle) anna mitään arvoa, joten tulos onkin arvattavissa.
Tein seuraavat muutokset eli vaihdoin kaikki PHP moodissa olevat muuttujat $snimi_form -> $_POST['snimi_form']. Nyt ohjelma käy kohdan "if(isset($_POST['snimi_form']))" lähi heti ajettaessa ja antaa virheilmoituksen:
Parse error: parse error, expecting `T_STRING' or `T_VARIABLE' or `T_NUM_STRING' in c:\program files\easyphp1-8\www\my_sql_002.php on line 84
eli SQL kyselyssä on virhe. Koitin myös sijoittaa $kysely .= "LIKE '%$tmt%'" mutta ei auta mukään...
Ohessa tämänhetkinen versio:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> <title></title> </head> <body> <?php echo $_POST['snimi_form']; function sql_tulokset_taulukkoon($tulos) { /*Kyselyn tuloksen rivien ja sarakkeidem lkm.*/ $riveja = mysql_num_rows($tulos); $sarakkeita = mysql_num_fields($tulos); 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>"); for($j=0; $j<$riveja; $j++) { echo ("</tr>\n"); for($i=0; $i<$sarakkeita; $i++) { printf("<td>%s</td>\n", mysql_result($tulos, $j,$i)); } echo ("</tr>"); } echo ("</table>"); echo $_SERVER['PHP_SELF']; } function lomake($sn) { ?> <form method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>" Etsi sukunimen tai sen osan perusteella: <br> <input type="text" name="snimi_form" value= "<?php if(isset($sn)) echo htmlspecialchars($sn) ?>"> <input type="submit" value="Hae!"> </form> <?php } /********* 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!"; // echo phpinfo(); } //valitaan tietokanta "osoitteet" mysql_select_db("osoitteet", $yhteys) or die("Tietokantaa ei löytynyt!"); if(isset($_POST['snimi_form'])) { /*Lähetetään kyselyn mukaiset tiedot lomakkelta*/ $_POST['snimi_form'] =addslashes($_POST['snimi_form']); $tmp=$_POST['snimi_form']; $kysely = "SELECT sukunimi, etunimi, email"; $kysely .= "FROM henkilot WHERE sukunimi"; $kysely .= "LIKE '%$_POST['snimi_form']%'"; } else { $kysely = "SELECT *"; $kysely .= "FROM henkilot"; } $tulos=mysql_query($kysely, $yhteys) or die("\n\rVirhe kyselyssä!". mysql_error()); if(!$tulos) { echo "Kyselyssä tapahtui virhe!"; exit; } lomake($_POST['snimi_form']); sql_tulokset_taulukkoon($tulos); ?> </body> </html>
harma kirjoitti:
Parse error: parse error, expecting `T_STRING' or `T_VARIABLE' or `T_NUM_STRING' in c:\program files\easyphp1-8\www\my_sql_002.php on line 84
eli SQL kyselyssä on virhe. Koitin myös sijoittaa $kysely .= "LIKE '%$tmt%'" mutta ei auta mukään...
MySQL kysely kyllä näyttää ihan oikealta, sen sijaan olet kirjoittanut sen väärään muotoon (käyttänyt hipsuja väärin), jolloin php-tulkki ei voi sitä kääntää.
muuta rivi 84 tällaiseksi:
$kysely .= "LIKE '%".$_POST['snimi_form']."%'";
Kiitti Lebe80 ja kaikki muutkin! Homma etenee ja tulee uusia virheolmoituksia...
Notice: Undefined index: snimi_form in c:\program files\easyphp1-8\www\my_sql_002.php on line 104
ja kun painaa Kysy! nappia homma kaatuu ja tulee
SQL yhteys saatu!Pol Virhe kyselyssä!You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE sukunimiLIKE '%Pol%'' at line 1
Ohessa "tähänhetkinen" versio:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> <title></title> </head> <body> <?php //echo $_POST['snimi_form']; function sql_tulokset_taulukkoon($tulos) { /*Kyselyn tuloksen rivien ja sarakkeidem lkm.*/ $riveja = mysql_num_rows($tulos); $sarakkeita = mysql_num_fields($tulos); 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>"); for($j=0; $j<$riveja; $j++) { echo ("</tr>\n"); for($i=0; $i<$sarakkeita; $i++) { printf("<td>%s</td>\n", mysql_result($tulos, $j,$i)); } echo ("</tr>"); } echo ("</table>"); echo $_SERVER['PHP_SELF']; } function lomake($sn) { ?> <form method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>" Etsi sukunimen tai sen osan perusteella: <br> <input type="text" name="snimi_form" value= "<?php if(isset($sn)) echo htmlspecialchars($sn) ?>"> <input type="submit" value="Hae!"> </form> <?php } /********* 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!"; // echo phpinfo(); } //valitaan tietokanta "osoitteet" mysql_select_db("osoitteet", $yhteys) or die("Tietokantaa ei löytynyt!"); if(isset($_POST['snimi_form'])) { /*Lähetetään kyselyn mukaiset tiedot lomakkelta*/ $_POST['snimi_form'] =addslashes($_POST['snimi_form']); $tmp=$_POST['snimi_form']; echo $tmp; $kysely = "SELECT sukunimi"; $kysely .= "FROM henkilot WHERE sukunimi"; $kysely .= "LIKE '%".$_POST['snimi_form']."%'"; } else { $kysely = "SELECT *"; $kysely .= "FROM henkilot"; } $tulos=mysql_query($kysely, $yhteys) or die("\n\rVirhe kyselyssä!". mysql_error()); if(!$tulos) { echo "Kyselyssä tapahtui virhe!"; exit; } lomake($_POST['snimi_form']); sql_tulokset_taulukkoon($tulos); ?> </body> </html>
WHERE sukunimiLIKE
->
WHERE sukunimi LIKE
lomake($_POST['snimi_form']);
->
if(!isset($_POST['snimi_form'])) $_POST['snimi_form'] = "";
lomake($_POST['snimi_form']);
Noticet osaa sitten olla niin turhauttavia.
Itse ongelmahan ei minua kiinnosta ;), jotakin korjauksia ja parannuksia ehdottaisin kuitenkin:
-Kyseessä on PHP-erhe, joten ei välttämättä tarvitse kaikkea html:ää pastettaa esille. Myös kooditagien käyttö on suositeltavaa
<?php echo ("</tr>"); // echo on komentorakenne, joten on luonnollisempaa käyttää --> echo "</tr>"; // kuten muualla koodissa ?>
<?php echo $_SERVER['PHP_SELF']; // PHP_SELFin sijasta suositellaan käytettäväksi SCRIPT_NAMEa tai mieluiten omaa vakiota --> echo $_SERVER['SCRIPT_NAME']; // tai define('LOMAKE_URI', "http://".$_SERVER['SERVER_NAME']."my_sql_002.php"); echo LOMAKE_URI; ?>
<?php if(isset($sn)) // tämä on aina tosi, koska muuten funktiokutsu ei mene läpi, funktio vaatii tämän parametrin ?>
<?php if(isset($yhteys)) // tämä on aina tosi, mysql_connect palauttaa falsen tai resurssin, joten --> if ($yhteys !== false) { ?>
<?php { echo "SQL yhteys saatu!"; // echo phpinfo(); } // ei kannata tässä lopettaa edellä mainittua iffiä kun tämän jälkeen tehdään kyselyitä ?>
<?php /** * tässä voisi käyttää ehkä mysql_real_escape_stringiä tai jopa * manuaalista kyseisen funktion esimerkeistä löytyvää * function quote_smart($value) funkkaria * ja palautusarvon voisi sijoittaa johonkin omaan muuttujaan * mieluummin kuin tuohon $_POST-taulukkoon */ $_POST['snimi_form'] = addslashes($_POST['snimi_form']); // --> $sukunimi_quote = quote_smart($_POST['sukunimi'); ?>
<?php // tähden tilalle voisi laittaa haettavien kenttien nimet $kysely = "SELECT *"; // -- die("\n\rVirhe kyselyssä! ".mysql_error()); // tuolla on välillä \n ja nyt \n\r (windows-rivinvaihto on \r\n), --> die("\nVirhe kyselyssä! ".mysql_error()); ?>
<?php exit; // die ja exit, yhtenäistä --> die(); // tai aikaisempi die exitiksi // -- // kannattaa heti scriptin alussa hakea $_POST['snimi_form'] johonkin muuttujaan, lyhempi kirjoittaa myöhemmin lomake($_POST['snimi_form']); -> ## esim. ## // scriptin alussa $sukunimi = $_POST['snimi_form'] // tämän vuoksi laitoin $sukunimi_quote tuolla ennemmin, eri muuttujat // lomake-funktion kutsussa lomake($sukunimi); ?>
Ps. Allekirjoittanut ei panisi pahakseen jos saataisiin joku korjaamaan koodien väritykset etc. *hint* *hint* *wink* *wink*
Sain scriptin toimimaan TEIDÄN avullanne! Todella SUURET kiitokset kaikille!
Aihe on jo aika vanha, joten et voi enää vastata siihen.