首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么mysql不告诉我复制是什么?

为什么mysql不告诉我复制是什么?
EN

Stack Overflow用户
提问于 2014-04-04 16:09:54
回答 2查看 93关注 0票数 2

我有一个简单的表,两个列和一个主键。下面是用于填充表的PHP:

代码语言:javascript
复制
$query = "INSERT INTO alt_upcs (sku, upc) VALUES (".$upc[0].",\"".$upc[1]."\")";
mysqli_query($link, $query);
if ($error = mysqli_error($link))
{
  if (preg_match("+DUPLICATE+i", $error))
  {
    $errQuery = "SELECT * FROM alt_upcs WHERE upc LIKE ".$upc[1];
    $result = mysqli_query($link, $errQuery);
    $errRow = mysqli_fetch_row($result);
    echo "Duplicate UPC found: ".$upc[1]." exists for skus ".$errRow[0]." and ".$upc[0].".\n";
  }
  else
  {
    echo $error."\n$query\n";
  }
}

$upc数组是从一个输入文件创建的,该文件包含以sku开头的行,后面是最多7个up。在一些罕见的情况下,有多个具有相同的UPC的sku,在更罕见的情况下,一个sku可以拥有相同的UPC两次。上面的代码对于前者很好,我得到了错误消息Duplicate UPC found: xxxx exists for skus yyyy and zzzz.

但是,当有一个带有两个UPC的sku,并且上面的代码块为第二个UPC运行时,我得到了Duplicate UPC found: xxxx exists for skus and zzzz.

显然,MySQL识别重复,那么为什么错误查询不显示它呢?

一些附加信息,upc是我唯一的键(主索引),我可以手动查询表,并在脚本中看到我想要得到的值。

感谢Bogdan引导我发现我的错误:我使用LIKE是因为字段类型(我忽略了共享)是varchar,而且我没有封装双引号的字符串$upc[1] -- MySQL认为我发送它是一个int,因为该字符串是数字的,它从任何前导零中删除。

这些工作中的任何一项,但第二项是我应该做的。

代码语言:javascript
复制
  $errQuery = "SELECT * FROM alt_upcs WHERE upc = ".$upc[1];

这是因为MySQL将字段的整数值与‘$upc1 1’整数值进行比较。

代码语言:javascript
复制
  $errQuery = "SELECT * FROM alt_upcs WHERE upc LIKE \"".$upc[1]."\"";

正确地封装字符串是我首先要做的事情。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-04 16:35:50

您的$errQuery将是:

代码语言:javascript
复制
SELECT * FROM alt_upcs WHERE upc LIKE foo

这是一个语法错误--应该引用LIKE后面的值:

代码语言:javascript
复制
SELECT * FROM alt_upcs WHERE upc LIKE 'foo'

尽管如果您不打算应用任何通配符,您应该使用一个直接的等式检查:

代码语言:javascript
复制
SELECT * FROM alt_upcs WHERE upc='foo'
票数 2
EN

Stack Overflow用户

发布于 2014-04-04 16:20:32

首先我觉得你做错了..。您应该在这里张贴sql表,以检查您在其中得到了什么。如果您不想在mysql中有副本,您可以使用一个唯一的字段来帮助您在表中保持数据的唯一性。它可能是在MySQL中查找重复记录的复制品

唯一的方法(我不确定从哪里有这个片段,到目前为止我还没有用过)

代码语言:javascript
复制
SELECT my_column, COUNT(*) as count
FROM my_table
GROUP BY my_column
HAVING COUNT(*) > 1

这里有一个关于这个问题的教程,查找重复的示例,如果你想使用google,另一个Google查找mysql副本,我认为这是最简单的方法。

代码语言:javascript
复制
SELECT * FROM table WHERE name = '$somevalue';

在php中,您可以看到这样的内容

代码语言:javascript
复制
if($result) {
 throw PDOException("Sorry Mate, Can\'t Do This Insert Duplicate Found");
} else { 
 // Let's make a run for it and insert the new data.
}

我的例子只是为了文章的目的,当然,您应该做得更优雅一点,但是我的方式很好:D。

mysql的示例选择类似

我的桌子上有下面的产品,对不起,不是英文的,但我希望你能买到。

代码语言:javascript
复制
$bex_products = array(
    array( // row #0
        'ProductName' => 'Hartie Copiator A4 Artist ',
    ),
    array( // row #1
        'ProductName' => 'Hartie Copiator A4 Xerox Bussines',
    ),
    array( // row #2
        'ProductName' => 'Hartie Copiator A3 Xerox Bussines',
    ),
    array( // row #3
        'ProductName' => 'Hartie Copiator A3 Maestro',
    ),
    array( // row #4
        'ProductName' => 'Hartie Copiator A3 Artist ',
    ),
    array( // row #5
        'ProductName' => 'Hartie Copiator A3 Maestro',
    ),
    array( // row #6
        'ProductName' => 'Hartie Copiator A3 Xerox Bussines',
    ),
    array( // row #7
        'ProductName' => 'Hartie Copiator A4 Artist ',
    ),
    array( // row #8
        'ProductName' => 'Hartie Copiator A4 Global',
    ),
    array( // row #9
        'ProductName' => 'Hartie Copiator A4 Xerox Bussines',
    ),
    array( // row #10
        'ProductName' => 'Hartie Copiator Color A4, 160 Gr, - Culori Pale',
    ),
    array( // row #11
        'ProductName' => 'Hartie Copiator Color A4, 80 Gr, - Culori Pale',
    ),
);

对于该输出,我使用了以下SQL:

代码语言:javascript
复制
SELECT ProductName FROM bex_products WHERE ProductName LIKE 'Hartie Copiator%'

正如您所看到的,它返回了包含字符串“Hartie”的所有行,而不仅仅是我所期望的一行,这将导致代码逻辑失败,如果数据库中的条目多于几个,则几乎总是返回一个错误的肯定。

产出无:

对于此输出,我使用了以下SQL:

代码语言:javascript
复制
SELECT ProductName FROM bex_products WHERE ProductName LIKE BINARY 'Hartie copiator%'

这个结果不会返回结果,因为我使用了二进制比较和'Hartie‘!== 'Hartie’,因为我没有'C‘,我有'c’。

现在如果我做了一个精确的匹配:

代码语言:javascript
复制
SELECT ProductName FROM bex_products WHERE ProductName LIKE 'Hartie Copiator A4 Artist%'

会回来

代码语言:javascript
复制
$bex_products = array(
    array( // row #0
        'ProductName' => 'Hartie Copiator A4 Artist ',
    ),
    array( // row #1
        'ProductName' => 'Hartie Copiator A4 Artist ',
    ),
);

正如您所看到的,我在mysql中为这个产品提供了一个重复条目(这是因为它们是从excel表中导入的,是谁编写的,在那里添加了两次,但是当我们完成添加产品和所有内容时,这个条目将被修复)

对于php部分,给出一个示例。

代码语言:javascript
复制
public function UserNameExists($username) {
    $this->database->query('SELECT UserName FROM tbl_users WHERE UserName = :username');
    $this->database->bind(':username', $username);
    if($this->database->single()) {
        return true;
    }

    return false;
}

对不起,到目前为止我还不太擅长编码。仍然在学习,有些人可能会发现这个方法写得不好(也许),但无论如何。对我来说很管用..。如果能用的话就没事了。如果是坏消息,请评论。不管怎么说我在那里做的事。首先,我使用准备好的陈述,然后从表用户中选择,以检查是否存在任何记录,该记录是否等于我从用户提交的表单中获得的用户名。我制作招投标,然后从数据库中请求一个单结果

此函数的返回值取决于fetch类型。在所有情况下,失败时都返回FALSE。这是php手册上的。既然我们知道它返回真还是假,我们就可以用一个真返回真;或者“全局”返回false。然后我用这样的方法:

代码语言:javascript
复制
    if($this->userHelper->UserNameExists('JoeDoe') {
        // set error and show it to the user 
    } else { 
       //run code here
    }

我希望这能帮助你理解和选择相似的想法和选择完全一样的东西。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22867802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档