Почему 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";
 }
}

Массив $upc создается из входного файла, содержащего строки, начинающиеся с sku, а затем до 7 upcs. В некоторых редких случаях есть более одного урока с одним и тем же UPC, и даже в более редких случаях один sku может иметь один и тот же UPC дважды. Код выше отлично работает для первого, я получаю сообщение об ошибке. Duplicate UPC found: xxxx exists for skus yyyy and zzzz.

Но, когда есть sku с двумя UPC, и выше код кода работает для второго UPC, я получаю Duplicate UPC found: xxxx exists for skus and zzzz.

Очевидно, что MySQL распознает дубликат, поэтому почему запрос об ошибке не показывает его?

Некоторая дополнительная информация, upc - мой уникальный ключ (первичный индекс), и я могу вручную запросить таблицу и увидеть значение, которое я пытаюсь получить в своем скрипте

Спасибо Bogdan за то, что он привел меня к моей ошибке: я использовал LIKE потому что тип поля (который я пренебрег для обмена) - varchar и я не инкапсулировал строку $upc[1] insite двойных кавычек - MySQL думает, что я отправляю это int, потому что строка является числовой, которая отрубает любые начальные нули.

Любая из этих работ, но вторая - это то, что я должен делать.

$errQuery = "SELECT * FROM alt_upcs WHERE upc = ".$upc[1];

Это работает, потому что MySQL сравнивает целочисленное значение поля с целым значением '$ upc [1]

$errQuery = "SELECT * FROM alt_upcs WHERE upc LIKE \"".$upc[1]."\"";

Правильное включение строки - это то, что я хотел сделать для начала.

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'


Прежде всего, я думаю, что вы все это делаете неправильно. И вы должны разместить здесь таблицу sql, чтобы проверить, что у вас там. если вы не хотите дублировать в mysql, вы можете использовать уникальное поле, которое поможет вам сохранить ваши данные уникальными в таблице. и это может быть дубликат поиска дубликатов записей в MySQL

Другой способ сделать (я не уверен, откуда у меня этот фрагмент, никогда не использовал его до сих пор, у меня был другой)

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

Вот учебник по этой проблеме. Найдите пример дубликатов. И если вы будете использовать Google немного Google, найдите дубликаты mysql. Еще один, я думаю, что это самый простой способ сделать это.

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

И в php у вас будет что-то вроде этого

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

Мой пример - только для цели, конечно, вы должны сделать это немного более элегантно, но мой способ работает отлично: D

Пример для mysql select like

У меня есть следующие продукты в моей таблице, жаль, что это не на английском, но вы получите идее, я надеюсь.

$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", у меня есть "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;
}

Извините, но пока я не очень хорошо разбираюсь в кодировании. Все еще учусь, и некоторые люди могут найти этот метод плохо написанным (возможно), но в любом случае.. для меня это работает и... если он работает, это нормально, если это плохой aproach, прокомментируйте. Во всяком случае, что я там делаю. Сначала я использую подготовленные инструкции, затем я делаю выбор из пользователей таблицы, чтобы проверить, существует ли какая-либо запись там, которая равна имени пользователя, которое я получил от формы, которую пользователь отправил. я делаю ставку, а затем запрашиваю один результат из базы данных.

Возвращаемое значение этой функции при успешном выполнении зависит от типа выборки. Во всех случаях FALSE возвращается при ошибке. Это из справочника php. теперь, когда мы знаем, что он возвращает true или false, мы можем проверить с помощью if true true true; или "global" возвращает false. и затем я использую вот так:

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

Надеюсь, это поможет вам понять идею с помощью select like и выбрать то же самое.

licensed under cc by-sa 3.0 with attribution.