为什么mysql不告诉我重复是什么?

时间:2014-04-04 16:09:54

标签: php mysql

我有一个简单的表,两列和一个主键。这是我用来填充表格的PHP:

$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";
  }
}

{1}}数组是从输入文件创建的,该文件包含以sku开头,后跟最多7个upcs的行。在一些罕见的情况下,有多个sku具有相同的UPC,并且在更罕见的情况下,单个sku可以具有相同的UPC两次。上面的代码适用于前者,我收到错误消息$upc

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

显然,MySQL会识别出副本,那么为什么错误查询不显示呢?

一些额外的信息Duplicate UPC found: xxxx exists for skus and zzzz.是我的唯一密钥(主索引),我可以手动查询表并查看我试图在脚本中获取的值

感谢Bogdan引导我犯错:我使用upc,因为字段类型(我忽略了分享)是LIKE而我没有封装字符串varchar insit of double quotes - MySQL认为我发送的是一个int,因为字符串是数字的,它会删除任何前导零。

其中任何一项都有效,但第二项是我应该做的。

$upc[1]

这是因为MySQL将字段的整数值与`$ upc [1]

的整数值进行比较
  $errQuery = "SELECT * FROM alt_upcs WHERE upc = ".$upc[1];

正确地封闭字符串是我打算开始做的事情。

2 个答案:

答案 0 :(得分:2)

您的$errQuery将会是:

SELECT * FROM alt_upcs WHERE upc LIKE foo

这是语法错误 - 应引用LIKE之后的值:

SELECT * FROM alt_upcs WHERE upc LIKE 'foo'

虽然如果你不打算申请任何通配符,你应该使用直接的平等检查:

SELECT * FROM alt_upcs WHERE upc='foo'

答案 1 :(得分:1)

首先,我认为你做错了..你应该在这里发布sql表来检查你在那里得到了什么。如果你不想在mysql中有重复项,你可以使用一个独特的字段来帮助你保持表中的数据唯一性。它可能是Find duplicate records in MySQL

的副本

其他的做法(我不知道我从哪里获得这个片段,到目前为止从未使用过我还有另外一个)

SELECT my_column, COUNT(*) as count
FROM my_table
GROUP BY my_column
HAVING COUNT(*) > 1

以下是有关此问题的教程Find duplicates example 如果你稍微使用谷歌Google find mysql duplicates 另一个我认为这是最简单的方法。

SELECT * FROM table WHERE name = '$somevalue';

在php中你会有这样的东西

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选择的示例如

我的桌子上有以下产品对不起它不是英文的,但你会得到我希望的想法。

$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:

SELECT ProductName FROM bex_products WHERE ProductName LIKE 'Hartie Copiator%'

正如你所看到的,它返回了包含字符串' Hartie Copiator'的所有行。不仅我认为你会期望的那一行,这将导致你的代码逻辑失败,如果你的数据库中有多个条目,那么几乎总会返回误报。

输出无:

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

SELECT ProductName FROM bex_products WHERE ProductName LIKE BINARY 'Hartie copiator%'

这个不会返回结果,因为我使用二元比较和' Hartie Copiator' !==' Hartie copiator'因为我没有“C'我有'

现在如果我做了完全匹配:

SELECT ProductName FROM bex_products WHERE ProductName LIKE 'Hartie Copiator A4 Artist%'

将返回

$bex_products = array(
    array( // row #0
        'ProductName' => 'Hartie Copiator A4 Artist ',
    ),
    array( // row #1
        'ProductName' => 'Hartie Copiator A4 Artist ',
    ),
);

正如你可以看到我在mysql中有一个重复的条目(这是因为它们是从excel表中导入的,并且是谁在那里添加了两次,但是当我们完成添加时这将被修复产品和一切)

对于php部分示例。

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

对不起,但到目前为止我还不是很擅长编码...还在学习,有些人可能会发现这种方法写的方式很糟糕(也许)但无论如何......对我来说它有效并且..如果它运作正常。如果这是一个不好的方法,请评论。 无论如何我在那里做什么。首先我使用prepared statements然后我从表用户中进行选择,以检查是否存在任何记录,该记录等于我从用户提交的表单中获得的用户名。我做了biding然后我从数据库中要求single result

  

此函数的成功返回值取决于获取类型。在所有情况下,失败时返回FALSE。   这是来自php手册。现在,我们知道它返回true或false,我们可以检查它是否真实的返回true;或者"全球"返回false。然后我像这样使用:

    if($this->userHelper->UserNameExists('JoeDoe') {
        // set error and show it to the user 
    } else { 
       //run code here
    }

我希望这可以帮助你理解选择喜欢的想法并选择完全相同的东西。

相关问题