Php 为什么Mysql会忽略文本?

Php 为什么Mysql会忽略文本?,php,mysql,Php,Mysql,我的PHP代码有问题。问题在于$\u GET['id']。如您所见,我输出了与用户id匹配的用户的结果集 问题是,当我在url上输入两个不同的值时,为什么会得到相同的结果(id为1的用户的resultset) URL 1: URL2: 不应该考虑文本(随机文本),因为代码似乎忽略了它 <?php try { $db = new PDO('mysql:host=127.0.0.1;dbname=ptp', 'root', 'root'); $db-&

我的PHP代码有问题。问题在于
$\u GET['id']
。如您所见,我输出了与用户id匹配的用户的结果集

问题是,当我在url上输入两个不同的值时,为什么会得到相同的结果(id为1的用户的resultset)

URL 1:

URL2:

不应该考虑文本(随机文本),因为代码似乎忽略了它

<?php

    try {
        $db = new PDO('mysql:host=127.0.0.1;dbname=ptp', 'root', 'root');
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    } catch (PDOException $e) {

    }
    $id = $_GET['id'];
    $sql = "SELECT * FROM users WHERE id = :id";

    echo $id . '<br/>';

    $query = $db->prepare($sql);

    $query->bindParam(':id', $id);
    $query->execute();


        while($r = $query->fetch(PDO::FETCH_ASSOC)) {
            print_r($r);
        }

    ?>

就像PHP一样,MySQL将把字符串
“1random”
转换为int
1
。因此,如果您的id字段是一个数字,则查询将被视为
“SELECT*FROM users WHERE id=1”
,即使在1后面有一些随机文本

在PHP中试试这个:
var\u dump('1dfg'==1)
它将返回true。MySQL也是如此


但是,如果您试图查找id为“dfg1”的用户,则不会返回任何内容,因为此字符串不能转换为int。

Put
var\u dump($e->getMessage())
在您的
catch
语句中,我已经尝试过了,但得到的结果不是错误,而是用户1的结果集!两个示例的id都是1,因为(希望)数据库字段
id
是一个整数,php尝试将“1randomtext”转换为整数。其计算结果为1。谜团已解开。请尝试以下操作:
$query->bindParam(':id',$id,PDO::PARAM_INT)谢谢,这对我解释了很多。我要采用的解决方案是对整数进行强制转换@phadam您能解释一下,为什么要强制转换吗?是的,这是一个很好的实践,可以验证数据,即使代码在没有验证的情况下工作。如果您需要int,请只接受int,不要依赖自动类型转换。根据您的常识:问题是,我需要强制转换,因为我想删除文本!我为什么要删除文本?因为我使用了两个表,一个用于用户,另一个用于跟踪用户获得的独特访客数量。因为跟踪器有一个varchar(跟踪器表)和用户id(用户表)是一个int,所以“1randomtext”仅被用户表识别为“1randomtext”,因为“1randomtext”会自动转换为1,而在varchar字段中,“1randomtext”不会自动转换为in,它基本上保持不变。我希望你能在某种程度上理解!如果您想知道为什么我不把tracker表中的varchar字段转换成int,那是因为我获取了visitor ip+userid并对它们进行散列!这就是为什么它需要是一个varchar字段!