2013-04-05 171 views
-2

嗨我想創建一個字符串,由變量存儲,其值由URL中的值確定。但是,我不確定如何去做。我不斷收到錯誤「意外的T_IF」。我可能做錯了什麼?在PHP中創建一個變量

感謝

PHP:

 $where= 

      if (isset($_GET['name'])) { 
       echo "name=" . $name; 
      } 
      if (isset($_GET['number'])) { 
       echo " AND number=" . $number; 
      } 
      if (isset($_GET['address'])) { 
       echo " AND address=" . $address; 
      } 
      if (isset($_GET['city'])) { 
       echo " AND city=" . $city; 
      } 
      if (isset($_GET['state'])) { 
       echo " AND state=" . $state; 
      } 
      if (isset($_GET['zip'])) { 
       echo " AND zip=" . $zip; 
      } 
      if (isset($_GET['color'])) { 
       echo " AND color=" . $color; 
      } 
     ; 
+1

爲什麼你會投下來,但沒有發表評論? – user2096890 2013-04-05 04:41:15

+0

這是一個語法錯誤問題。有很多喜歡它,這一個是沒有什麼不同。語法錯誤總是過於本地化,因爲它們在http://stackoverflow.com/search?q=%5Bphp%5D+unexpected+T_IF+is%3Aquestion之前已經被記錄。注意大多數這些問題都有負面投票。 StackOverflow不是您的個人皮棉檢查器。 – 2013-04-05 13:25:35

回答

1

你不能像這樣聲明PHP變量。你必須連接變量。

<?php 
$where = ''; 
if (isset($_GET['name'])) { 
    $where .= " name=" . $name; 
} 
if (isset($_GET['number'])) { 
    $where .= " AND number=" . $number; 
} 
if (isset($_GET['address'])) { 
    $where .= " AND address=" . $address; 
} 
if (isset($_GET['city'])) { 
    $where .= " AND city=" . $city; 
} 
if (isset($_GET['state'])) { 
    $where .= " AND state=" . $state; 
} 
if (isset($_GET['zip'])) { 
    $where .= " AND zip=" . $zip; 
} 
if (isset($_GET['color'])) { 
    $where .= " AND color=" . $color; 
} 
echo $where; 
?> 
0

使用此:

if (isset($_GET['name'])) { 
    $where .= "name=" . $name; 
} 
if (isset($_GET['number'])) { 
    $where .= " AND number=" . $number; 
} 
if (isset($_GET['address'])) { 
    $where .= " AND address=" . $address; 
} 
if (isset($_GET['city'])) { 
    $where .= " AND city=" . $city; 
} 
if (isset($_GET['state'])) { 
    $where .= " AND state=" . $state; 
} 
if (isset($_GET['zip'])) { 
    $where .= " AND zip=" . $zip; 
} 
if (isset($_GET['color'])) { 
    $where .= " AND color=" . $color; 
} 

基本上,.=告訴PHP的=到什麼已經存在結束後的價值大頭釘變量。

在你的問題中,你使用的是錯誤的echoecho只是表示在頁面上寫下下面的內容,而不是將後面的內容分配給變量。

+0

但是這隻設置$到當前正在測試的變量的哪裏。我需要它積累。 – user2096890 2013-04-05 03:41:51

+0

'。='導致它累積(技術上「連接」)。 – 2013-04-05 03:42:27

+1

其中積累實際上意味着連接... – ElefantPhace 2013-04-05 03:43:15

0

嘗試

$where=""; 

然後

if (isset($_GET['name'])) { 
    $where .= "name=" . $name; 
} 
if (isset($_GET['number'])) { 
    $where .= " AND number=" . $number; 
} 
if (isset($_GET['address'])) { 
    $where .= " AND address=" . $address; 
} 

等。

8

我會簡化這一點。

$whereElements = array(); 
foreach ($_GET as $key=>$value) { 
    $whereElements[] = $key . '=' . $value; 
} 
$where = implode(' AND ', $whereElements); 

如果你不想要所有的變量,你總是可以白名單/提供一個過濾鍵的數組。另外,如果您在SQL或其他環境中使用它,則應該使用準備好的查詢,因爲這將對SQL注入開放。

+1

這也避免了以'AND'開頭的字符串,這可能是不可取的。 – icktoofay 2013-04-05 03:42:34

+1

+1這裏是最好的答案。 – 2013-04-05 03:53:23

+0

+1好技巧! – ElefantPhace 2013-04-05 04:08:49

2

嘗試

 $where=""; 

      if (isset($_GET['name'])) { 
       $where .= "name=" . $name; 
      } 
      if (isset($_GET['number'])) { 
       $where .= " AND number=" . $number; 
      } 
      if (isset($_GET['address'])) { 
       where .= " AND address=" . $address; 
      } 
      if (isset($_GET['city'])) { 
       where .= " AND city=" . $city; 
      } 
      if (isset($_GET['state'])) { 
       $where .= " AND state=" . $state; 
      } 
      if (isset($_GET['zip'])) { 
       $where .= " AND zip=" . $zip; 
      } 
      if (isset($_GET['color'])) { 
       $where .= " AND color=" . $color; 
      } 
echo $where; 
+0

它工作完美謝謝你! – user2096890 2013-04-05 03:43:48

+0

不客氣。 – 2013-04-05 03:45:46

0

或者你在啓用了register_globals(這是邪惡的!),或者你的代碼不會有任何效果。

$where= 

在這裏,你開始了一個任務,...

if (isset($_GET['name'])) { 
    echo "name=" . $name; 
} 

...並與if聲明中斷它。這就是PHP抱怨的原因。

接下來的問題是你檢查一個變量($_GET['name'])的存在,然後使用另一個變量($name)。

此外,您顯然正在嘗試構建(一部分)SQL查詢而不保護數據庫不被黑客入侵。

因此,爲了簡化代碼,使其更安全,將其更改爲

// $mysqli = new mysqli("localhost", "my_user", "my_password", "my_database"); 

$properties = array('number', 'address', 'city', 'state', 'zip', 'color'); 
$conditions = array(); 
foreach ($properties as $property) { 
    if (!empty($_GET[$property])) { 
     $conditions[] = sprintf("`%s`='%s'", $property, $mysqli->real_escape_string($_GET[$property])); 
    } 
} 
$where = implode(' AND ', $conditions);