【问题标题】:PDO return same result no matter using INT or not无论是否使用 INT,PDO 都返回相同的结果
【发布时间】:2014-06-14 17:32:06
【问题描述】:

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

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

当 POST 表单在 'id' 字段中使用 '1' 时,函数返回从表中获取的 'data'。

但是,当使用 '1aaxxacac' POST 表单时,该函数返回相同的结果。

我已经尝试过使用:

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

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

真诚地希望你们能帮我解决这个问题。

谢谢!

【问题讨论】:

  • @Musa 是的,我应该使用 is_numeric 吗?但是如何将它与我的 foreach 集成?我发现一些网站认为 is_numeric 性能不佳。不过,谢谢
  • 从您的书签中删除这些网站,或者 - 更好的是 - 在您的防火墙上禁止它们

标签: php mysql post pdo int


【解决方案1】:

涉及两个问题

  1. 一个是mysql相关的,一个广为人知的,叫做“loose typing”。 Mysql 会在使用前尝试转换你的数据:

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

不过我觉得这里没什么问题。

【讨论】:

  • 谢谢,您能给我一些解决方法吗?我认为使用除了is_numeric之外还有其他方法。非常感谢
  • 老实说,我看不出这里要解决什么问题。你能解释一下你面临的特定问题吗?您的应用程序因此而出现故障?它会产生一些错误吗?还是什么?
  • 当用户键入一个包含整数的字符串时,仍然可以处理函数。除了使用 jquery 来验证表单之外,如何防止这种情况发生。
  • 我对字符串值和 is_numeric() 函数都没有问题。看来您只是喜欢用不存在的问题来困扰自己。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
相关资源
最近更新 更多