2017-01-02 39 views
0

在這裏與位置直接來一個小問題。 得到一個頁面,用戶需要有正確的「代碼」來訪問該頁面,這些鏈接被URLs共享,如http://www.domain.com/index.php?c=65487549 如果用戶來到這個頁面沒有?c =或只是純文件名index.php 他們應該被送到另一個地方。

是我迄今爲止嘗試:

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(); 
     } 
    } 

如果用戶從數據庫正確的代碼,用戶會看到頁面。

任何線索?

感謝=)

+1

'如果(!isset($ _ GET [ 'C'])== 「」)'這是一個假的正;你需要將這些分成兩個單獨的條件。你也開放給SQL注入。 –

+0

@ Fred-ii-好的,謝謝。我打算在上線之前得到sql注入,但是感謝你讓我知道:-) – KommerSnart

+2

請閱讀並理解'isset()'的作用及其工作方式:http://php.net/manual/en/function .isset.php –

回答

-1

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

變化

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

像弗雷德-II說..

+0

問題是:「爲什麼」他們應該改變它?有一個具體的原因 –

+0

這應該是'||'而不是'&&'。 –

+0

沒有必要只是空的($ _ GET ['c']);將這樣做 – Robert

0

我也碰到過這種情況。我會建議的是

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(); 
    } 
} 

我認爲這將完成這項工作。如果不是,請評論。希望它有幫助

+0

試過你的代碼,謝謝,但給了我警告:mysqli_num_rows()期望參數1是mysqli_result,布爾在/ home/2/v中給出...幾乎與以前相同的消息unfortanly :-) – KommerSnart

+0

感謝嘗試代碼。我認爲這個錯誤是在其他部分。當你傳遞c值時,在查詢'SELECT code FROM Codes WHERE code =''。(isset($ _ GET ['c']))。''將它改爲'SELECT code FROM Codes WHERE code =''。 ($ _GET ['c'])。'我認爲重定向一定有效。做到了? –

+0

重定向的工作就像一個魅力:-)但是,當用戶來到頁面後什麼也沒有.php然後白頁不幸。 – KommerSnart

0

只需在您的代碼的第一行中刪除==「」。 並在查詢中從中刪除「isset」。

isset正在檢查變量「是否設置」 - 如果存在。它只返回TRUE或FALSE,所以在查詢中你不會尋找FALSE或TRUE。

1

我會寫這樣的代碼:

// 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; 
} 

始終是更好地消毒用戶輸入。無論你如何得到它,從表單,GET,POST等等始終清理用戶輸入。

當你只需要一個來自數據庫的結果限制你的查詢時,這會加快事情的速度。

在if語句中始終使用嚴格的比較。爲什麼?運行下面的代碼,你就會明白爲什麼:

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

如果使用嚴格比較===的,如果將工作,因爲它應該給。

後來編輯:

這是錯誤的

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

,因爲如果是真的,併爲''空字符串isset將返回一個布爾值(true或false),這裏面字符串將被翻譯爲1如果是沒有設置哪個在任何情況下將是一個bug發生器

+0

感謝您對我的代碼的解釋!我嘗試了你的方式,但是得到這個:注意:未定義的索引:c在/home/2/v/www/index.php在第5行警告:不能修改標題信息 - 已經發送的標題(在/ home/2/v/www/index.php:5)在/home/2/v/www/index.php在線10 – KommerSnart

+0

您可以使用通知抑制器'(int)@ $ _ GET ['c']; '但不推薦。您也可以在函數或類方法中包含此代碼,並且如果找到該代碼並且在數據庫中未找到false,則返回true。如果返回是錯誤的,那麼你可以重定向。所以你可以添加一些測試 –

0

不是我想的最好的解決方案,但這個工作就像我問。 .php重定向用戶後沒有任何內容。 ?c =重定向用戶後無任何代碼或錯誤代碼。 如果代碼正確,顯示頁面。

如果任何人有一個更好的版本,我很高興對所有幫助:-)

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(); 
     } 
    }