Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Toimii intrassa, netissä ei

skydesign [30.08.2006 11:11:11]

#

Koska en ole itse löytänyt ratkaisua pyydän apua Teiltä. Ongelma: Alla olevilla koodirimpsuilla rakennettu tietokantaan hakuja suorittava ohjelma (perustuu W. Jason Gilmoren tuotoksiin) toimii intranetissä mutta ei internetissä? Kun suoritan kyselyn saan virheilmoituksen:

Parse error: parse error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /home/(DOMAININ NIMI)/public_html/mysql.class.php on line 3


Tässä koodit haku.php ja mysql.class.php

haku.php

<p>
   HAKEMISTO<br />
   <form action="haku.php" method="post">
      Syötä hakusana:<br />
      <input type="text" name="keyword" size="20" maxlength="40" value="" /><br />
      <input type="submit" value="Etsi">
   </form>
</p>

<?php
   // If the form has been submitted with supplied keyword
   if (isset($_POST['keyword'])) {
      include "mysql.class.php";
      // Connect to server and select database
      $mysqldb = new mysql("localhost","root","kirja","kuva");
      $mysqldb->connect();
      $mysqldb->select();
      $keyword = $_POST['keyword'];
      $keyword = utf8_encode($keyword);

      // Create the query
      $mysqldb->query("SELECT *
FROM `kuva`.`kuvakanta`
WHERE `NRO` LIKE CONVERT( _utf8 '%$keyword%'
USING latin1 )
COLLATE latin1_general_ci
OR `KOHDE` LIKE CONVERT( _utf8 '%$keyword%'
USING latin1 )
COLLATE latin1_general_ci
OR `TAPAHTUMA` LIKE CONVERT( _utf8 '%$keyword%'
USING latin1 )
COLLATE latin1_general_ci
OR `AIHE` LIKE CONVERT( _utf8 '%$keyword%'
USING latin1 )
COLLATE latin1_general_ci
OR `PAIKKA` LIKE CONVERT( _utf8 '%$keyword%'
USING latin1 )
COLLATE latin1_general_ci
OR `AIKA` LIKE CONVERT( _utf8 '%$keyword%'
USING latin1 )
COLLATE latin1_general_ci
OR `KUVAAJA` LIKE CONVERT( _utf8 '%$keyword%'
USING latin1 )
COLLATE latin1_general_ci
OR `ORIGINAALI` LIKE CONVERT( _utf8 '%$keyword%'
USING latin1 )
COLLATE latin1_general_ci
OR `KUVATIEDOSTO` LIKE CONVERT( _utf8 '%$keyword%'
USING latin1 )
COLLATE latin1_general_ci"
);

      // Output retrieved rows or display appropriate message
      if ($mysqldb->numrows() > 0) {
         while ($row = $mysqldb->fetchobject())
            echo "Nro: $row->NRO,<br>
	    Kohde: $row->KOHDE,<br>
  	    Tapahtuma: $row->TAPAHTUMA,<br>
	    Aihe: $row->AIHE,<br>
	    Paikka: $row->PAIKKA,<br>
	    Aika: $row->AIKA,<br>
	    Kuvaaja: $row->KUVAAJA,<br>
	    Originaali: $row->ORIGINAALI,<br>
	    Kuvatiedosto: $row->KUVATIEDOSTO
            <p>
            <br />";
      } else {
         echo "Haku ei tuottanut tulosta";
      }
   }

?>

mysql.class.php

<?php
   class mysql {
      private $linkid; // MySQL link identifier
      private $host; // MySQL server host
      private $user; // MySQL user
      private $pswd; // MySQL password
      private $db; // MySQL database
      private $result; // Query result
      private $querycount; // Total queries executed

      /* Class constructor. Initializes the $host, $user, $pswd and $db fields. */
      function __construct($host, $user, $pswd, $db) {
         $this->host = $host;
         $this->user = $user;
         $this->pswd = $pswd;
         $this->db = $db;
      }

      /* Connects to the MySQL database server. */
      function connect() {
         try {
            $this->linkid = @mysql_connect($this->host,$this->user,$this->pswd);
            if (! $this->linkid)
               throw new Exception("Could not connect to the MySQL server.");
         }
         catch (Exception $e) {
            die($e->getMessage());
         }
      }

      /* Selects the MySQL database. */
      function select() {
         try {
            if (! @mysql_select_db($this->db, $this->linkid))
               throw new Exception("Could not connect to the MySQL database.");
            }
         catch (Exception $e) {
            die($e->getMessage());
         }
      }

      /* Execute database query. */
      function query($query) {
         try {
            $this->result = @mysql_query($query,$this->linkid);
            if (! $this->result)
               throw new Exception("The database query failed.");
         }
         catch (Exception $e) {
            echo($e->getMessage());
         }
         $this->querycount++;
         return $this->result;
      }

      /* Determine total rows affected by query. */
      function affectedRows() {
         $count = @mysql_affected_rows($this->linkid);
         return $count;
      }

      /* Determine total rows returned by query. */
      function numRows() {
         $count = @mysql_num_rows($this->result);
         return $count;
      }

      /* Return query result row as an object. */
      function fetchObject() {
         $row = @mysql_fetch_object($this->result);
         return $row;
      }

      /* Return query result row as an indexed array. */
      function fetchRow() {
         $row = @mysql_fetch_row($this->result);
         return $row;
      }

      /* Return query result row as an associative array. */
      function fetchArray() {
         $row = @mysql_fetch_array($this->result);
         return $row;
      }

      /* Return total number queries executed during lifetime of this object. Not required, but interesting nonethless. */
      function numQueries() {
         return $this->querycount;
      }

       /* Return the number of fields in a result set. */
       function numberFields() {
          return @mysql_num_fields($this->result);
       }

       /* Return a field name given an integer offset. */
       function fieldName($offset) {
          return @mysql_field_name($this->result, $offset);
       }

       function getResultAsTable($actions) {

          if ($this->numrows() > 0) {

             // Start the table
             $resultHTML = "<table border='1'>\n<tr>\n";

             // Output the table header
             $fieldCount = $this->numberFields();

             for ($i=1; $i < $fieldCount; $i++) {
                $rowName = $this->fieldName($i);
                $resultHTML .= "<th>$rowName</th>\n";
             } # end for

             $resultHTML .= "<th>actions</th></tr>\n";

             // Output the table data
             while ($row = $this->fetchRow()) {
                $resultHTML .= "<tr>\n";
                for ($i = 1; $i < $fieldCount; $i++)
                   $resultHTML .= "<td>".htmlentities($row[$i])."</td>\n";

                // Replace VALUE with the correct primary key
                $action = str_replace("VALUE", $row[0], $actions);

                // Add the action cell to end of the row
                $resultHTML .= "<td nowrap>&nbsp;$action</td>\n</tr>\n";

             } # end while

             // Close the table
             $resultHTML .= "</table>\n";
          } else {
             $resultHTML = "No results found";
          }
          return $resultHTML;

       } #end getResultAsTable()

   }
?>

Kiitos.

Olga [30.08.2006 12:38:04]

#

Taitaapa olla PHP:n versio < 5 tuolla palvelimella (netissä), jolloin nuo luokan muuttujien näkyvyysmääreet eivät toimi. Myöskin try-catch -rakenne taitaa jäädä haaveeksi.

skydesign [30.08.2006 15:39:04]

#

Kiitos Olga. Näin tuo asian laita todellaki oli. Milläköhän editoinnilla siitä sais PHP 4.4 päällä pyörivän. PHP kieli on vielä sen verran lapsenkengissä että ainakin vinkkiä kaipaisin.

Antti Laaksonen [30.08.2006 15:55:21]

#

Erillisen luokan käyttöön ei ole oikeastaan mitään tarvetta, kun PHP:ssä on valmiiksi hyvät MySQL-funktiot. Koko ongelmia aiheuttava tiedosto mysql.class.php joutaa pois.

Tässä oppaassa on tietoa MySQL:n käytöstä:
https://www.ohjelmointiputka.net/oppaat/opas.php?tunnus=phpj8

Sinun täytyy siis muuttaa kaikki "$mysqldb->"-alkuiset kohdat käyttämään suoraan PHP:n funktioita. Korvaus pitäisi olla aika suoraviivaista oppaan avulla. Luokan funktioista näkee myös vinkkiä. Jos jonkin kohdan muuttaminen ei onnistu, niin saat kyllä apua täältä.

ajv [30.08.2006 20:51:48]

#

Luokan käyttö on ihan fiksua jos vaikka kanta sattuu vaihtumaan ja muutenkin ne on kivoja. Itse suosittelisin avautumaan palveluntarjoalle että päivittäkää aataminaikaiset ohjelmistonne! :)

skydesign [31.08.2006 09:46:51]

#

Laitoinkin aiheesta jo palautetta palveluntarjoajalle. Eikös tämä PHP5 ole ollut käytössä jo muutamia vuosia?

Olga [31.08.2006 13:24:59]

#

Näppärästihän tuon muuttaa toimivaksi myös aiemmilla PHP:n versioilla ja luokan käyttöä suosittelen kyllä minäkin vahvasti. Eli näkyvyysmääreet pois muuttujista, tilalle var. Eli private $host; --> var $host; jne. Sitten try-catch -rakenne mäkeen ja oma simppeli virheenkäsittely tilalle, tyyliin if (! $this->linkid) { return false; } tai mieluummin joku vähän informatiivisempi. Itellä on yleensä joku debug-muuttuja, jonka arvoa vaihtelemalla saan virheilmoitukset näkyviin (tai tiedostoon) testausmielessä. Lopuksi vielä konstruktorin nimeksi sama kuin luokan nimi, eli function __construct --> function mysql. Luokan nimet olis tosin hyvä kirjoittaa aina isolla alkukirjaimella, mut ei taida PHP:ssa olla niin väliä.

Mut noilla vinkeillä pitäis lähteä toimimaan, ellei jotain jäänyt huomaamatta. Ja hyvä kun laitoit palautetta sinne palveluntarjoajalle, paljonkin yleisemmässä käytössä sais olla tuo PHP5 kun niin paljon on kuitenkin kehittyneempi ku aiemmat versiot.

Vastaus

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

Tietoa sivustosta