Google API PHP-Script

Hi ihr!

Tut mir Leid, wenn ich den Thread noch einmal ausgrabe, aber ich möchte Google API bei mir auch einbauen.

Ich habe also folgendes, hier genanntes, Script genommen, und es in search.php gepackt:
CODE <?php

require_once("nusoap.php");

$key = "meingooglekey";
$start = 0;
$query = $_POST['q'];

$soapclient = new soapclient("http://api.google.com/search/beta2"); // [1]

$parameters = array(
   "key"         => $key,
   "q"           => "site:gac-portal.de $query",
   "start"       => $start,
   "maxResults"  => 10,
   "filter"      => false,
   "restrict"    => "",
   "safeSearch"  => false,
   "lr"          => "lang_de",
   "ie"          => "UTF-8",
   "oe"          => "UTF-8"
 );
$result = $soapclient->call("doGoogleSearch", $parameters, "urn:GoogleSearch");
$searchtime = $result["return"]["searchTime"];
$begin = $start + 1;
$end = $start + $parameters["maxResults"];
$total = $result["return"]["estimatedTotalResultsCount"];


for ($i = 1; $i <= $parameters["maxResults"]; $i++)
{
$element = $result["return"]["resultElements"][$i];
  $url = $element["URL"];
  $title = $element["title"];
  $snippet = $element["snippet"]; // [2]
 


  echo "<a href=$url>$url</a><br>";
 }

?>


Von einer anderen Seite wird folgendes Formular abgegeben:

CODE <FORM method="POST" action="search.php">
<INPUT TYPE="text" name="q" size="10" maxlength="255" value="">
<INPUT type="submit" VALUE="suche">
</FORM>


Allerdings erhalte ich eine völlig weiße Seite, wenn ich das Formular abschicke und auf die search.php komme. Woran liegt das?

Bin für Hilfe sehr dankbar.

Gruß,
blue


edit: wie ich gerade gesehen habe, ist es das gleiche Problem wie bei Patzor. Auch die leeren Links.
 
QUOTE Woran liegt das?

Ja nach Deinem Feindbild ist der Verursacher bei den Amerikanern, Russen oder Chinesen zu suchen...

Was zeigt folgender Code an?


CODE echo "<pre>";
var_dump( $result );
echo "</pre>";

 
Folgendes:
CODE array(11) {
["directoryCategories"]=>
string(1) "
"
["documentFiltering"]=>
string(5) "false"
["endIndex"]=>
int(0)
["estimateIsExact"]=>
string(5) "false"
["estimatedTotalResultsCount"]=>
int(0)
["resultElements"]=>
string(1) "
"
["searchComments"]=>
string(0) ""
["searchQuery"]=>
string(19) "site:gac-portal.de "
["searchTime"]=>
float(0.06737)
["searchTips"]=>
string(0) ""
["startIndex"]=>
int(0)
}


Wenn ich das Formular ausfülle findet er ebenfalls passende Einträge in der Form.
 
Das ist eine Erlärung für die leere Seite....

CODE ["estimatedTotalResultsCount"]=>
int(0)


Wenn es keine Ergebnisse gibt, kann er auch nichts anzeigen...

Du musst das also überprüfen, z.B.


CODE
....
$total = $result["return"]["estimatedTotalResultsCount"];

if ($total<=0) { // keine Resultate
echo "Leider nix da...";

}


for ($i = 1; $i <= $parameters["maxResults"]; $i++)
{
$element =....
 
Ehm.. Du meinst für einen eingegeben Wert bspw. "Team Berlin" gibt es keine Eintragungen bei Google? Das ist ja nicht wahr..

Auszug aus der Suche mit deinem gegeben Code:
QUOTE array(11) {
  ["directoryCategories"]=>
  string(1) "
"
  ["documentFiltering"]=>
  string(5) "false"
  ["endIndex"]=>
  int(10)
  ["estimateIsExact"]=>
  string(5) "false"
  ["estimatedTotalResultsCount"]=>
  int(149)
  ["resultElements"]=>
  array(10) {
    [0]=>
    array(9) {
      ["URL"]=>
      string(59) "http://www.gac-portal.de/forum/archive/index.php/t-759.html"
      ["cachedSize"]=>
      string(2) "5k"
      ["directoryCategory"]=>
      array(2) {
        ["fullViewableName"]=>
        string(0) ""
        ["specialEncoding"]=>
        string(0) ""
      }
      ["directoryTitle"]=>
      string(0) ""
      ["hostName"]=>
      string(0) ""
      ["relatedInformationPresent"]=>
      string(4) "true"
      ["snippet"]=>
      string(185) "[Archiv] Swat Team Berlin Team-Vorstellung. ... Vollständige Version anzeigen :
  Swat Team Berlin. Dswjust. 08.04.2005, 19:52 . ..."
      ["summary"]=>
      string(0) ""
      ["title"]=>
      string(51) "Swat Team Berlin [Archiv] - GAC-Forum"
    }
 
Danke für die Hilfe erstmal. Neuer Tag, neues Glück..

Wenn ich eine Suchanfrage mit dem Formular mache und auf der search.php lande, dann wird in der ersten Zeile "Leider nix da.." angezeigt. Allerdings sieht man durch das
CODE echo "<pre>";
var_dump( $result );
echo "</pre>";
, dass es schon Ergebnisse gibt? S.o.

Tut mir Leid für solche Fragen, aber ich verstehe es wirklich nicht.
 
Aha. Der Penner, der das Script in die FAQ gestellt hat, hat Sch.. gebaut... Das Script enthielt Fehler.

Wenn Du den var_dump von $result betrachtest, fälllt Dir auf:
$results ist ein Array
Es hat 11 Einträge
$result["result"]["estimatedTotalResultsCount"] existiert nach var_dump nicht
$result["estimatedTotalResultsCount"] existiert.
=>
CODE [...]
$searchtime = $result["searchTime"];
$begin = $start + 1;
$end = $start + $parameters["maxResults"];
$total = $result["estimatedTotalResultsCount"];


for ($i = 1; $i <= $parameters["maxResults"]; $i++)
{
$element = $result["resultElements"][$i];
$url = $element["URL"];
[...]


Ebenso fehlt searchTime in dem Array, aber so sollte es laufen.
 
Ja, da hast du Recht.

Klappt jetzt auch.

Lieben Dank
smile.gif

 
Nun habe ich doch noch zwei Probleme. gna..

Zum einen, wenn ich in das Formular ein Wort mit Umlaut angebe, kommt wieder das altbekannte Problem, dass auf der Seite keine Ergebnisse angezeigt werden. Dabei ist Unicode UTF-8 gesetzt.

Ein anderes Problem erweist sich mit der Ausgabe. Derzeit werden 9 Ergebnisse ausgegeben. Ich möchte aber, dass alle Ergebnisse ausgegeben werden. So dachte ich mir, setze ich einfach das naheliegende "maxResults" hoch.. Ergebnis war wieder eine leere Seite mit leeren Link-Tags.

huh.gif
 
Ich überlege jetzt ja schon ein paar Tage darüber, aber ich komme nicht darauf..

Ich meine in dem hier gegeben Script wird ja UTF-8 gesetzt, muss ich das jetzt im Formular nochmal einbringen? Wie? Mit einem Hidden-Input? Aber wie sollte der dann aussehen.

Das seltsame ist ja wieder, dass es nur diese leere Seite mit den leeren Links gibt.

So sieht das Formular aus:
CODE <FORM method="POST" action="index.php?section=search">
<INPUT TYPE="text" name="q" size="10" maxlength="255" value="">
<INPUT type="submit" VALUE="suche">
</FORM>


Und so das Script (mit der Ausschließung des doppelten Inhalts):

CODE require_once("nusoap.php");

$key = "Mein Google-Key";
$start = 0;

$query = $_POST['q'];


$soapclient = new soapclient("http://api.google.com/search/beta2"); // [1]

$parameters = array(
"key" => $key,
"q" => "site:gac-portal.de $query",
"start" => $start,
"maxResults" => 10,
"filter" => false,
"restrict" => "",
"safeSearch" => false,
"lr" => "lang_de",
"ie" => "UTF-8",
"oe" => "UTF-8"
);
$result = $soapclient->call("doGoogleSearch", $parameters, "urn:GoogleSearch");
$searchtime = $result["searchTime"];
$begin = $start + 1;
$end = $start + $parameters["maxResults"];
$total = $result["estimatedTotalResultsCount"];


for ($i = 1; $i <= $parameters["maxResults"]; $i++)
{
$element = $result["resultElements"][$i];
$url = $element["URL"];
$title = $element["title"];
$snippet = $element["snippet"]; // [2]

$search = array('ö','ü','ä');
$replace = array('ö','ü','ä');
$title = str_replace($search, $replace, $title);
$snippet = str_replace($search, $replace, $snippet);

//dublicate content:
if ( (!$known[$url] and !$known[$title]) ) {
$known[$title] = true;
$known[$url] = true;


if ($title != "\n" && $url != "\n") {

echo utf8_decode(str_replace("{url}", $url,
str_replace("{snippet}",
str_replace("<br>", "", $snippet),
str_replace("{title}", $title, "")
)
)
);

}
}

echo "<a href=$url><b>$title</a></b><br/>$snippet<br/><a href=$url>$url</a><br/><br/>";
}



Kurzfassung der Problemstellung:
1. Suche mit Umlauten ergibt weiße Seite mit leeren Links.
2. Ich möchte alle Ergebnisse anzeigen lassen, wie?
 
Diesmal war ich etwas langsamer.

Deine Probleme sind mit einfachem PHP lösbar. Das müsstest Du aber anwenden:

Wegen den Umlauten: Machs Dir doch einfach. Ersetzte in der Query (bevor Du sie an die Api gibtst) mit str_replace alle Umlaute durch Doppellaute (?gibts das Wort), also ä mit ae, ü mit ue, ... Genau wie Du es gemacht hast, einfach in dem Parameter ($query) und nicht erst im Resultat.

Wenn Du mehr als 10 Resultate pro Seite anzeigen willst, gibt es mehrere Möglichkeiten. (Ich warne aber vor der Langsamkeit, die schon 3 Anfragen nach sich ziehen!) Ich versuche es mit der in meinen Augen einfachsten:
Mit einer Schlaufe. Zb. for:
for ($res = 1; $res<=3; $res=$res+1) { *** }

Die *** ersetzt Du durch Deinen bisherigen Code ab der SOAP Anfrage ($soapclient->call), wobei Du noch den den Start im Parameter Array verändern musst ($parameters['start'] = (int) $res."0";).

Weitere Infos gibts bei http://www.php.net. Einfach z.B. "for" ins Suchfeld eintippen und ab gehts.

Verstanden?
 
Hi Alain, danke erstmal für die Antwort.

Leider ergeben sich da noch einige Probleme.

Das mit den Umlauten funktioniert trotzdem noch nicht, auch wenn ich das str_replace in der query mache:
CODE
$query1 = $_POST['q'];

$search = array('ö','ü','ä');
$replace = array('ö','ü','ä');
$query = str_replace($search, $replace, $query1);


Ebenfalls funktioniert das mit der Anzeige nicht. Ich will ja im Grunde nicht mehr als 10 Beiträge anzeigen lassen, es soll ja dann eigentlich mit einer Blätterfunktion weiter gehen. Allerdings funktioniert die Lösung, die du gegeben hast, auch nicht. Es führt zu einer leeren Seite (Der Quellcode zeigt die bekannten "leeren" Links)..


Danke für deine Hilfe!
 
Nochmal:

QUOTE Machs Dir doch einfach. Ersetzte in der Query (bevor Du sie an die Api gibtst) mit str_replace alle Umlaute durch Doppellaute (?gibts das Wort), also ä mit ae, ü mit ue, ...

Verstehst Du was str_replace macht?
 
Guten Abend,

habe das irgendwie nicht ganz mitgekriegt mit den Umlauten, vermutlich nicht vernünftig gelesen. Danke, geht jetzt.

Das zweite Problem besteht immernoch. Er findet zwar quasi die Einträge, jedoch zeigt er sie nur mit leeren Links an.. (wie oben beschrieben).
 
QUOTE Derzeit werden 9 Ergebnisse ausgegeben. Ich möchte aber, dass alle Ergebnisse ausgegeben werden.


Also halt nochmal. Bitte genauer in Zukunft und etwas mehr Eigeninitiative.

Du hast also

QUOTE $start = 0;

Was wenn da steht

QUOTE $start = $_REQUEST['start'];

Weisst Du was das bedeutet?
Ändere $_POST in $_REQUEST.
Dann kannst Du mit $total die Anzahl der Unterseiten bestimmen und so a la

QUOTE for () {
echo "<a href='deinedatei.php?query=$query&start=$i>[$i]</a> ";
}

ausgeben

Alles klar?
 
Tut mir Leid, ich komme damit irgendwie nicht wirklich klar..

Also, anstatt
CODE $start = 0;

soll jetzt

QUOTE $start = $_REQUEST['start'];

stehen?

Woher kommt denn das ['start']?
Wenn ich das so mache, gibt es keine Resultate mehr.

Und dann muss ich nur noch unten eine for-Schleife einbauen, damit diese Blätterfunktion funktioniert? Selbst damit habe ich irgendwie ein Problem.
Eigentlich sieht ja eine for-Schleife folgendermaßen aus: for(Startwert, Bedingung, Zähler) { }
Aber ich komm damit nicht klar..
 
Hallo,

auch wenn das Thema schon älter ist, hoffe ich, dass mir trotzdem jemand weiterhelfen kann. Ich hab das obige Script verwendet, bekomm aber immer die Fehlermeldung Fatal error: Cannot redeclare class soapclient in D:\xampp\xampp\htdocs\soap\nusoap.php on line 4096

Woran könnte das liegen? Ich verwende Xampp 1.5.1 (also PHP 5.1.1)

Vielen Dank im Voraus

Johannes
 
Und inwiefern soll mir das weiterhelfen? Was der Fehler bedeutet, war mir auch klar. Nur war ich der Meinung, dass der Fehler sicher nicht in der nusoap.php liegt. Die Zeile 4096 ist übrigens das Ende der Datei.

Ich wollte nur wissen, ob noch jemand Probleme mit nusoap.php und eurem Skript in Verbindung mit Xampp hatte...

Egal, hab jetzt den Apache 1.3 installiert und da läufts problemlos
 
QUOTE Und inwiefern soll mir das weiterhelfen? Was der Fehler bedeutet, war mir auch klar. Nur war ich der Meinung, dass der Fehler sicher nicht in der nusoap.php liegt. Die Zeile 4096 ist übrigens das Ende der Datei.

Hier steht die Antwort:
http://www.php-faq.de/q/q-fehler-class-redeclare.html
Das ist der erste Link aus Alains Suche.

Du hast den Code vermutlich direkt in die Beispiel-Quellen von xampp reingesetzt.
Hättest du die überflüssige include-Anweisung entfernt, hätte alles funktioniert.
Das ist kein Problem der xampp-Umgebung.

 
Zurück
Oben