与我的问题类比, 所以我有一个名为sample_table的表,它有1个名为input的字段。 sample_table有2条记录," A"和" B"。我的程序可以更新两者中的任何一个,并且有一个验证。如果我改变" B"到" A",它将无效,(A已经存在)。改变" A"到" B" (B已存在)。此验证有效,因为在更新查询发生之前,我将执行选择查询,检查该值是否已存在,如果不存在任何值,则将进行更新。问题是,如果我更新" B"进入小写" b",我的程序验证并检测B已经存在。如何将B更新为b?这就是我想要发生的事情。
我的代码
<?php
function update()
{
$sup_id = $_POST['flavor_id'];
$flavor_name = $_POST['flavor_name2'];
$flavor_name = trim($flavor_name);
$sql = "update flavor set flavor_name = :flavor_name where id = :sup_id";
$stmt = "SELECT * FROM flavor WHERE flavor_name=:flavor_name";
try
{
$STM2= $conn -> prepare($stmt);
$STM2->bindparam(":flavor_name", $flavor_name);
$STM2 -> execute();
$row=$STM2->fetch(PDO::FETCH_ASSOC);
if(strtolower($row['flavor_name'])==strtolower($flavor_name))
{
echo " <p class=failed> Flavor is already existing </p>";
}
else
{
$STM = $conn -> prepare($sql);
$STM->bindparam(":sup_id", $sup_id);
$STM->bindparam(":flavor_name", $flavor_name);
$STM -> execute();
echo " <p class=success> Flavor Updated</p> "; }
}
catch( PDOException $e )
{
echo $e->getMessage();
}
}
?>
答案 0 :(得分:0)
默认情况下,MySQL查询不区分大小写。您可以通过将列collation设置为区分大小写或不区分大小写来将列设置为区分大小写。但是你可能不希望在列本身中加入区分大小写(除非你需要用于索引目的,见下文)。
要运行区分大小写的查询,您需要使用BINARY
关键字来适当地投射列:
SELECT * FROM sample_table WHERE sample_column = BINARY 'a';
这只会为您提供匹配&#34; a&#34;,而不是&#34; A&#34;。
如果要向用户显示一些智能错误消息,则需要此类逻辑。如果您只想创建例外情况或忽略更改,则可以在列上创建Unique Index - 根据您的情况,您需要确保其区分大小写。然后你可以做以下事情:
UPDATE [IGNORE] sample_table SET sample_column = 'a';
IGNORE
是可选的,这就是为什么它在括号中。如果列没有违反唯一索引,那将更新列,如果 违反唯一索引并且省略IGNORE
,它会给你一个MySQL错误,它会默默地没有如果它违反唯一索引并且您使用IGNORE
。
编辑以解决现在在OP的问题中的代码:
所以,你在结果上专门使用strtolower()
来压制任何案例差异。您可以从代码中删除这些调用并直接比较字符串:
//if(strtolower($row['flavor_name'])==strtolower($flavor_name))
if($row['flavor_name']==$flavor_name)
...这可能是您正在寻找的内容,或者如果案例不匹配,您可以使用上面的查询修改甚至不会收到匹配的结果。
答案 1 :(得分:0)
您可以使用ASCII字符代码来表示字母&#39; A&#39;和&#39; B&#39;和他们的小写字母&#39; a&#39;和&#39; b&#39;。例如:存储char&#39; A&#39;在将它放入数据库之前,将其更改为ASCII代码,如果你想要的话,你可以将它改成65后的字符。