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> $action</td>\n</tr>\n"; } # end while // Close the table $resultHTML .= "</table>\n"; } else { $resultHTML = "No results found"; } return $resultHTML; } #end getResultAsTable() } ?>
Kiitos.
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.
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.
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.
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ä.
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! :)
Laitoinkin aiheesta jo palautetta palveluntarjoajalle. Eikös tämä PHP5 ole ollut käytössä jo muutamia vuosia?
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.