2017-01-02 3 views
0

Komm zu einem kleinen Problem hier mit Standort direkt. Haben Sie eine Seite, auf der der Benutzer den richtigen "Code" haben muss, um auf die Seite zuzugreifen, werden diese Links von URLs wie http://www.domain.com/index.php?c=65487549 geteilt. Wenn Benutzer zu dieser Seite ohne den? C = oder einfach nur Dateinamen index.php kommen sollte an einen anderen Ort gesendet werden.

Was ich versucht habe bisher:

if (!isset($_GET['c']) == "") { 
       header ('Location: http://www.domain.com/another.php'); 
       exit(); 
    } else { 
     $result2 = $link->query('SELECT code FROM Codes WHERE code="'. (isset($_GET['c'])).'"'); 
    $CodeisValid = mysqli_num_rows($result2); 

     if ($CodeisValid) { 
      return true; 
     } else { 
       header ('Location: http://www.domain.com/another.php'); 
       exit(); 
     } 
    } 

Wenn der Benutzer den richtigen Code von db hat, sollten Benutzer die Seite sehen.

Irgendwelche Hinweise?

Dank =)

+1

'if (! Isset ($ _ GET [ 'c']) == "")', dass ein falsch ist positiv; Sie müssen diese in zwei separate Bedingungen aufteilen. Sie sind auch offen für eine SQL-Injektion. –

+0

@ Fred-ii-Ok, danke. sql injection Ich wollte vor dem Going live gehen, aber danke, dass du mich informiert hast :-) – KommerSnart

+2

Bitte lies und versteh was 'isset()' tut und wie es funktioniert: http://php.net/manual/en/function .isset.php –

Antwort

-1

if (!isset($_GET['c']) == "") { header ('Location: http://www.domain.com/another.php'); exit(); }

Änderung

if (!isset($_GET['c']) && $_GET['c'] == "") { header ('Location: http://www.domain.com/another.php'); exit(); }

Wie Fred-ii sagte ..

+0

Frage ist: "Warum" sollten sie es zu ändern? Es gibt einen bestimmten Grund –

+0

Das sollte '||' nicht '&&' sein. –

+0

gibt es keine Notwendigkeit für das nur leer ($ _ GET ['c']); wird den Fall tun – Robert

0

ich auf diese Situation gekommen sind. Was ich vorschlagen würde, ist

if (empty($_GET['c'])) { 
      header ('Location: http://www.domain.com/another.php'); 
      exit(); 
} else { 
    $result2 = $link->query('SELECT code FROM Codes WHERE code="'. (isset($_GET['c'])).'"'); 
$CodeisValid = mysqli_num_rows($result2); 

    if ($CodeisValid) { 
     return true; 
    } else { 
      header ('Location: http://www.domain.com/another.php'); 
      exit(); 
    } 
} 

Ich denke, das wird den Job machen. Wenn nicht, bitte Kommentar. Hoffe, es hilft

+0

Versucht Ihren Code, danke, aber gibt mir Warnung: mysqli_num_rows() erwartet Parameter 1 zu sein mysqli_result, boolean gegeben in/home/2/v ... Fast die gleiche Nachricht wie zuvor leider :-) – KommerSnart

+0

Danke für den Code ausprobieren. Ich denke, der Fehler ist mit im else Teil. Übergeben Sie den Wert c in der Abfrage 'SELECT code FROM Codes WHERE code = ''. (Isset ($ _ GET ['c'])) '' ändern Sie es in 'SELECT code FROM Codes WHERE code ="'. ($ _GET ['c']). "" Ich denke, die Weiterleitung muss funktionieren. Erledigt? –

+0

Die Umleitung funktioniert wie ein Charme :-) Aber wenn ein Benutzer auf die Seite kommt mit nichts nach .php dann weiße Seite leider. – KommerSnart

0

Entfernen Sie einfach == "" in der ersten Zeile Ihres Codes. Und in der Abfrage entfernen "isset" von dort.

isset prüft, ob die Variabel "gesetzt ist" - falls vorhanden. Es gibt nur TRUE oder FALSE zurück, so dass Sie in der Abfrage nicht nach FALSE oder TRUE suchen.

1

würde ich den Code wie folgt schreiben:

// remove unallowed characters from user input 
$code = (int) $_GET['c']; // this will make sure your code is an integer. If you use other characters use `preg_replace` instead. 
// There are many ways to sanitize the input here 

// if is empty redirect user 
if (empty($code)) { 
    header('Location: http://www.domain.com/another.php'); 
    die; 
} 

$result2 = $link->query('SELECT code FROM Codes WHERE code = "'. $code .'" LIMIT 1'); 
$CodeisValid = mysqli_num_rows($result2); 

if ($CodeisValid !== 0) { 
    return true; 
} else { 
    header ('Location: http://www.domain.com/another.php'); 
    die; 
} 

ist immer besser, die Benutzereingaben zu sanieren. Egal wie Sie es bekommen, von Formularen, von GET, POST, etc. Bereinigen Sie immer die Benutzereingaben.

Wenn Sie nur ein Ergebnis von Datenbank benötigen, begrenzen Sie Ihre Abfrage, dies wird die Dinge rücksichtsvoll beschleunigen.

Verwenden Sie in if-Anweisungen immer strenge Vergleiche. Warum ? Führen Sie den folgenden Code, und Sie werden sehen, warum:

<?php 
if ('string' == 0) { 
    echo 'you got me'; 
} 

Wenn Sie den strengen Vergleich === die verwendet werden, wenn funktioniert, wie es sollte.

Später bearbeiten:

Das ist falsch

'SELECT code FROM Codes WHERE code="'. (isset($_GET['c'])).'"'; 

weil isset eine boolean (wahr oder falsch) zurück, die innerhalb String wird als 1 übersetzt werden, wenn wahr und als '' leere Zeichenfolge ist, wenn ist nicht eingestellt, die in jedem Fall ein Bug-Generator wird

+0

Vielen Dank für Ihre Erklärung meines Codes! Ich habe Ihren Weg auch versucht, aber bekommen dann: Hinweis: Undefinierter Index: c in/home/2/v/ww/index.php in Zeile 5 Warnung: kann Header-Informationen nicht ändern - Header bereits gesendet von (Ausgang gestartet um/home/2/v/www/index.php: 5) in /home/2/v/www/index.php on line 10 – KommerSnart

+0

Sie können den notice suppressor '(int) @ $ _ GET ['c']; 'wird aber nicht empfohlen. Sie können diesen Code auch in einer Funktion oder einer Klassenmethode verwenden und true zurückgeben, wenn der Code gefunden wurde und false nicht in der Datenbank gefunden wird. Wenn die Rückgabe falsch ist, können Sie die Umleitung vornehmen. Sie können also einige Tests hinzufügen –

0

Nicht die beste Lösung, die ich denke, aber diese eine funktionierte genau so, wie ich gefragt habe. Mit nichts nach .php redirect user. Mit nichts oder falschem Code nach? C = Benutzer umleiten. Wenn der Code korrekt ist, Seite anzeigen.

Wenn jemand eine bessere Version hat, ich bin für jede Hilfe glücklich :-)

if (empty($_GET['c'])) { 
     header ('Location: http://www.domain.com'); 
     die(); 
    } 

    if (isset($_GET['c'])) { 
     $GetCode = htmlspecialchars($_GET['c']); 

     $result = $link->query('SELECT code FROM FF_Products WHERE code = "'. $GetCode .'" LIMIT 1'); 
     $CodeisValid = mysqli_num_rows($result); 

     if ($CodeisValid > 0) { 
     // is valid if set return true here, only shows white page! 
     } else { 
      header ('Location: http://www.domain.com'); 
      die(); 
     } 
    }