2014-06-14 15 views
0

表的設計在我的數據庫如下,PDO返回相同的結果,無論使用INT或不

AID INT(10) AUTO_INCREMENT  
ID INT(20) 
DATA VARCHAR(50) 
Engine = MyISAM 

我做一個形式,以POST數據到執行的SQL查詢的功能。

<form method="post" action="test.php" > 
    <input type="text" name="id" /><BR/> 
    <input type="text" name="val1" /><BR/> 
    <input type="text" name="val2" /><BR/> 
    <input type="text" name="val3" /><BR/> 
    <input type="submit" name= "t" value="submit"/> 
</form> 

陣列和回聲結果:

if (isset($_POST['t'])){ 
foreach(array($_POST) as $data) { 
echo send($data); 
} 
}; 

這裏是功能:

當使用 'ID' 字段 '1' POST形式
function send($data){ 
     //MySQL connected 
     $do = $sql->prepare("SELECT id, data FROM test WHERE id =?"); 
     $do->bindValue(1, $data['id'], PDO::PARAM_INT); 
     $do -> execute() ; 
      if ($do -> rowCount()=== 1){ 
       $getData = $do -> fetch(); 
        return $getData['data']; 
      } 
} 

,該函數返回從表格中提取'數據'。

但是,當使用'1aaxxacac'POST表單時,函數返回相同的結果。

我已經嘗試過使用:

  $do -> execute(array(':id'=>$data['id])); 

來代替以前的一個,但仍然有同樣的問題。 如果我在MySQL中將ID字段從INT更改爲CHAR或VARCHAR,則情況已解決。

真誠地希望你們能幫我弄明白。

謝謝!

+0

http://www.php.net/manual/en/language.types.string.php#language.types.string.conversion – Musa

+0

@Musa是的,我應該使用is_numeric?但如何將其與我的foreach整合?我發現一些網站認爲is_numeric表現不佳。但是,謝謝 – user3740833

+0

從您的書籤中刪除這些網站或 - 更好 - 禁止它們在您的防火牆上 –

回答

1

有兩個問題涉及

  1. 一個是MySQL相關的,一個廣爲人知的一個,被稱爲「弱類型」。 MySQL會嘗試使用它之前投你的數據:

    mysql> select id from board where id='2foo'; 
    +----+ 
    | id | 
    +----+ 
    | 2 | 
    +----+ 
    
  2. 另一個是PDO相關的和相當奇怪的:PDO::PARAM_INT不投字符串值爲int。它測試值類型並相應地進行綁定:因此,如果它已經是int(或bool)類型,它只會將值綁定爲int。否則,它被綁定爲字符串並按原樣發送到mysql。我不知道爲什麼它會表現出如此奇怪的方式,所以它不得不被人記住。

雖然我在這裏看不出太多問題。

+0

謝謝,並且請給我一些技巧來解決它?我認爲在那裏使用除了is_numeric之外的其他方法。非常感謝 – user3740833

+0

我真的不知道該在這裏解決什麼問題。你能解釋一下你面臨的某些問題嗎?你的應用程序由於這個故障?它會產生一些錯誤?或者是什麼? –

+0

當用戶鍵入一個包含整數的字符串時仍然可以得到處理的函數。除了使用jquery驗證表單之外,如何防止這種情況。 – user3740833