Frage zu Zufallslink

visurox

Grünschnabel
Meine Tabelle ist "search" und meine Spalte "Webadresse".

Code:
// connecten
$dbhost = "xxx";
$dbname = "xxx";
$dbuser = "xxx";
$dbpass = "xxx";

global $connect_db;

$connect_db = new mysqli();
$connect_db->connect($dbhost, $dbuser, $dbpass, $dbname);
$connect_db->set_charset("utf8");

if ($connect_db->connect_errno) {
    printf("Connect failed: %s\n", $connect_db->connect_error);
    exit();
}

$sql="SELECT * FROM search WHERE Webadresse ORDER BY RAND() LIMIT 1";
$result=mysql_query($sql);

$row = mysql_fetch_array($result);
    extract($row);
    echo "<a href=\"$result" /></a><br />\n";
}

Irgendwas scheint mit meinem Code nicht zu stimmen. Nur was?
PHP ist doch ganz schön schwierig für einen Tag. Uff!
 
Ich erwarte das er sich aus der Spalte "Webadresse" einen zufälligen Link raussucht und diesen aufruft, wenn ich auf der Seite auf "Zufälligen Link" klicke. Anzeigen tut er gerade garnichts. Also eine weiße Seite. Ich versuche es mal mit "mysql_error()".

habe jetzt
Code:
$sql="SELECT * FROM search WHERE Webadresse ORDER BY RAND() LIMIT 1";
echo mysql_error();
ausprobiert. Zeigt aber weiterhin eine weiße Seite.
Vielleicht sollte ich es für heute gut sein lassen.

EDIT2:
Code:
$sql="SELECT * FROM search WHERE Webadresse ORDER BY RAND() LIMIT 1";
$result=mysql_query($sql);
OR die("Error: $sql <br>".mysql_error());
brachte auch keine Veränderung. Schluss für heute.
 
Zuletzt bearbeitet:
Versuch es mal so:

PHP:
$sql="SELECT * FROM search WHERE Webadresse ORDER BY RAND() LIMIT 1";
$result=mysql_query($sql) OR die("Error: $sql <br>".mysql_error());

Außerdem ist ORDER BY RAND() sehr langsam.

EDIT: Außerdem ist anzuraten, die Fehler-Anzeige und den Fehler-Level hoch zusetzen:

PHP:
// schreib mich an den Anfang des Scripts
error_reporting(E_ALL|E_STRICT);
ini_set('display_errors', 1);
 
Zuletzt bearbeitet:
Du machst eine Verbindung per mysqli auf und nutzt dann die veralteten mysql-Funktionen. Bleib bei mysqli.

PHP:
$result=mysql_query($sql);
 
$row = mysql_fetch_array($result);
    extract($row);
    echo "<a href=\"$result" /></a><br />\n";

Das hier soll sicher auch rein logisch nicht so oder die mehrfache Verwendung von $result für verschiedene Zwecke ist zumindest sehr unglücklich.

Edit:

Da stimmt noch viel mehr nicht. Hier mal eine Vorlage:

PHP:
<?php

error_reporting(-1);
    // Setzt alle Bits auf 1, gibt also alle Fehler aus. Kann ab PHP 5.4 auch
    // E_ALL sein
    // (siehe Doku, <http://de1.php.net/manual/en/function.error-reporting.php>)
ini_set('display_errors', 1);

$dbhost = 'localhost';
$dbname = 'database';
$dbuser = 'user';
$dbpass = 'password';

$connect_db = new mysqli($dbhost, $dbuser, $dbpass, $dbname);

if (null !== $connect_db->connect_error) {
    throw new Exception(sprintf('Connect Error (%s) %s',
            $connect_db->connect_errno, $connect_db->connect_error));
}

if (false === $connect_db->set_charset('utf8')) {
    throw new Exception(sprintf('Error (%s) %s',
            $connect_db->errno, $connect_db->error));
}

$sql = "SELECT * FROM table ORDER BY RAND() LIMIT 0,1";

$result = $connect_db->query($sql);

if (false === $result) {
    throw new Exception(sprintf('Error (%s) %s',
            $connect_db->errno, $connect_db->error));
}

while ($row = $result->fetch_assoc()) {
    var_dump($row);
}

„Bildschirm bleibt weiß“ deutet in der Regel auf Syntaxfehler hin. Wenn du zum Beispiel eine der bekannten IDEs nutzt (NetBeans, Eclipse, PhpStorm, …) zeigt die dir das in der Regel schon beim Entwickeln an. Ansonsten kannst du dein Skript auch per Konsole auf korrekte Syntax prüfen: $ php -l script.php

Allgemeine Tipps zum Debugging etwa hier:

- http://php-de.github.io/#debugging
- http://phpforum.de/forum/showthread.php?t=216927

PS: global würde ich generell und extract würde ich fast immer vermeiden. Nutze Variablenübergabe per Parameter beziehungsweise Arrays.
 
Zuletzt bearbeitet:
Versuch es mal so:

PHP:
$sql="SELECT * FROM search WHERE Webadresse ORDER BY RAND() LIMIT 1";
$result=mysql_query($sql) OR die("Error: $sql <br>".mysql_error());

Außerdem ist ORDER BY RAND() sehr langsam.

EDIT: Außerdem ist anzuraten, die Fehler-Anzeige und den Fehler-Level hoch zusetzen:

PHP:
// schreib mich an den Anfang des Scripts
error_reporting(E_ALL|E_STRICT);
ini_set('display_errors', 1);

Danke für den Hinweis. Was wäre den besser als order by rand()?

Du machst eine Verbindung per mysqli auf und nutzt dann die veralteten mysql-Funktionen. Bleib bei mysqli.

PHP:
$result=mysql_query($sql);
 
$row = mysql_fetch_array($result);
    extract($row);
    echo "<a href=\"$result" /></a><br />\n";

Das hier soll sicher auch rein logisch nicht so oder die mehrfache Verwendung von $result für verschiedene Zwecke ist zumindest sehr unglücklich.

Edit:

Da stimmt noch viel mehr nicht. Hier mal eine Vorlage:

PHP:
<?php

error_reporting(-1);
    // Setzt alle Bits auf 1, gibt also alle Fehler aus. Kann ab PHP 5.4 auch
    // E_ALL sein
    // (siehe Doku, <http://de1.php.net/manual/en/function.error-reporting.php>)
ini_set('display_errors', 1);

$dbhost = 'localhost';
$dbname = 'database';
$dbuser = 'user';
$dbpass = 'password';

$connect_db = new mysqli($dbhost, $dbuser, $dbpass, $dbname);

if (null !== $connect_db->connect_error) {
    throw new Exception(sprintf('Connect Error (%s) %s',
            $connect_db->connect_errno, $connect_db->connect_error));
}

if (false === $connect_db->set_charset('utf8')) {
    throw new Exception(sprintf('Error (%s) %s',
            $connect_db->errno, $connect_db->error));
}

$sql = "SELECT * FROM table ORDER BY RAND() LIMIT 0,1";

$result = $connect_db->query($sql);

if (false === $result) {
    throw new Exception(sprintf('Error (%s) %s',
            $connect_db->errno, $connect_db->error));
}

while ($row = $result->fetch_assoc()) {
    var_dump($row);
}

„Bildschirm bleibt weiß“ deutet in der Regel auf Syntaxfehler hin. Wenn du zum Beispiel eine der bekannten IDEs nutzt (NetBeans, Eclipse, PhpStorm, …) zeigt die dir das in der Regel schon beim Entwickeln an. Ansonsten kannst du dein Skript auch per Konsole auf korrekte Syntax prüfen: $ php -l script.php

Allgemeine Tipps zum Debugging etwa hier:

- http://php-de.github.io/#debugging
- http://phpforum.de/forum/showthread.php?t=216927

PS: global würde ich generell und extract würde ich fast immer vermeiden. Nutze Variablenübergabe per Parameter beziehungsweise Arrays.

Danke für deinen Code! Der Fehler mit mysqli fiel mir vorhin dann auch auf.
Warum ist meine Version für das result unglücklich?
Ich werde das error repoting in Zukunft gleich benutzen, das sollte unnötige Threads ersparen.
Die Links werde ich mir gleich anschauen, Danke.
 
Warum ist meine Version für das result unglücklich?

Weil $result eigentlich mit dem Objekt belegt ist, das die vom Datenbanksystem ermittelnden Datensätze (auch wenn das nur einer ist) verwaltet.

Wenn du das in dem extract($row); mit einem URL-String überschreibst (falls das an der Stelle deine Absicht ist), geht das Objekt flöten. Ist in diesem Fall vom Effekt her „nicht so wichtig“, weil du den einen Datensatz ja schon verarbeitet hast, ist aber auch hier kein guter Stil. Besser ist es, Variablen während ihrer Lebenszeit nicht auch noch ganz andere Sachen zuzuweisen als ursprünglich.
 
Weil $result eigentlich mit dem Objekt belegt ist, das die vom Datenbanksystem ermittelnden Datensätze (auch wenn das nur einer ist) verwaltet.

Wenn du das in dem extract($row); mit einem URL-String überschreibst (falls das an der Stelle deine Absicht ist), geht das Objekt flöten. Ist in diesem Fall vom Effekt her „nicht so wichtig“, weil du den einen Datensatz ja schon verarbeitet hast, ist aber auch hier kein guter Stil. Besser ist es, Variablen während ihrer Lebenszeit nicht auch noch ganz andere Sachen zuzuweisen als ursprünglich.

Gut zu wissen. Ich bin ja mehr oder minder unfreiwillig in den MySQL teich hineingesprungen. Und alles von anfang an zu lernen, ist für 2-3 Dateien/Scripte eine für mich übertriebene Arbeit. Aber dank den freundlichen Hinweisen von euch, werde ich früher oder später schon auf den richtigen Code kommen. :)
 
Hi,
Warum machst du es nicht so ?
PHP:
<a href=deineseite.php?zufallsLink=<?=Rand(1,$maxPages);?>">Zufalls Link</a>
$maxPages sind die maximalen Datenbank Einträge und du gibts jeder seite eine ID und löste dann mit
PHP:
If(isset($_Geht["zufallsLink"])) {
$id=$_Geht["zufallsLink"];
$query="SELECT * FROM `links` WHERE ID=" . $id;
}
Schreibe das von tablet können also Syntax Fehler drinne sein :)
Hoffe aber du versteht was ich damit meine
Mfg
 
Zuletzt bearbeitet von einem Moderator:
ID-Folgen können/sollten nicht als lückenlos angesehen werden. Einzelne Datensätze können gelöscht werden.

Die Alternativen zu ORDER BY RAND(), die man sich so im Web suchen kann, sind aber wohl leider eher kompliziert, ja. (Ich müsste das auch erst recherchieren.)
 

Neue Beiträge

Zurück