Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Ongelmallinen skripti

Sivun loppuun

harma [04.05.2006 13:27:03]

#

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);

?>

T.M. [04.05.2006 14:06:41]

#

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.

harma [04.05.2006 14:13:45]

#

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

T.M. [04.05.2006 14:22:56]

#

Tuot lomakkeelta tietoja, joten kaikki lomakkeen muuttujat löytyvät $_POST taulukosta: $_POST['snimi_form']

harma [04.05.2006 14:25:13]

#

Sorry nyt meni yli... Mitä minun pitäisi muuttaa? Toivottavasti jaksat vielä vaivautua

sooda [04.05.2006 14:33:59]

#

Register_globals on (onneksi) pois päältä, eli tuota ei saa suoraan muuttujasta ($snimi_form) vaan _post:n sisältä ($_POST['snimi_form']).

harma [04.05.2006 14:37:27]

#

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!

sooda [04.05.2006 14:38:43]

#

Muuta $snimi_form -> $_POST['snimi_form'].

harma [04.05.2006 14:43:29]

#

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

Lebe80 [04.05.2006 14:59:37]

#

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.

harma [04.05.2006 15:07:21]

#

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>

Lebe80 [04.05.2006 15:23:07]

#

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']."%'";

harma [04.05.2006 15:34:24]

#

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>

T.M. [04.05.2006 15:37:59]

#

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.

tsuriga [04.05.2006 15:56:12]

#

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*

harma [04.05.2006 17:12:46]

#

Sain scriptin toimimaan TEIDÄN avullanne! Todella SUURET kiitokset kaikille!


Sivun alkuun

Vastaus

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

Tietoa sivustosta