无论是否使用INT,PDO都会返回相同的结果

时间:2014-06-14 17:32:07

标签: php mysql post pdo int

我的数据库中的表格设计如下,

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

我创建一个表单,以便将数据发送到执行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);
 } 
};

这是功能:

    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'];
            }
}

使用&#39; 1&#39; in&#39; id&#39;字段,函数返回数据&#39;从桌子上拿走。

然而,当使用&#39; 1aaxxacac&#39;要POST表单,该函数返回相同的结果。

我已经尝试过使用:

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

替换上一个但仍然有同样的问题。 如果我在MySQL中将ID字段从INT更改为CHAR或VARCHAR,情况就解决了。

真诚地希望你们能帮我解决一下。

谢谢!

1 个答案:

答案 0 :(得分:1)

涉及两个问题

  1. 一个是与mysql相关的,一个广为人知的,叫做#34;松散打字&#34;。 Mysql会在使用之前尝试转换数据:

    mysql> select id from board where id='2foo';
    +----+
    | id |
    +----+
    |  2 |
    +----+
    
  2. 另一个与PDO相关并且非常奇怪:PDO::PARAM_INT 不会将字符串值转换为int 。它测试值类型并相应地绑定:因此,如果它已经是int(或bool)类型,它只将值绑定为int。否则它被绑定为字符串并按原样发送到mysql。我不知道为什么它表现得如此奇怪,因此,它必须被记住。
  3. 我认为这里没有太多问题。