Php 为什么Mysql会忽略文本?
我的PHP代码有问题。问题在于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-&
$\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”
转换为int1
。因此,如果您的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字段!