Проблема проверки уникальности в базе данных MySQL - PullRequest
0 голосов
/ 18 июня 2011

Я пытаюсь убедиться, что строка уникальна в столбце MySQL.Вот пример кода:

<?php
$con = mysql_connect("hostname", "username", "password");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}

mysql_select_db("table_name", $con);


if (!mysql_num_rows(mysql_query("SELECT * FROM table_name WHERE unique_string = '123456' 
LIMIT 1"))) {

die('This string is not unique.');
}
mysql_close($con);
?>

В этом примере кода я ввел значение 123456 в качестве примера.В этом примере предполагается, что строка 123456 уже существует в столбце unique_string.Следовательно, он должен умереть и вернуть выражение «Эта строка не уникальна».К сожалению, это не так.Ты знаешь почему?Есть ли лучший способ сделать эту проверку?

Ответы [ 3 ]

2 голосов
/ 18 июня 2011

Обычно неразумно связывать ваши вызовы функций, как у вас. Особенно с вызовами базы данных. Функции mysql _ * () ожидают передачи определенных вещей, таких как дескрипторы операторов. Но они могут возвращать логическое значение FALSE вместо дескриптора, если есть проблема. Это ЛОЖЬ передается вместо дескриптора, а затем все ломается.

Общее правило - всегда предполагать, что ваш запрос каким-то образом потерпит неудачу, и программировать с защитой:

$sql = "SELECT ....";
$result = mysql_query($sql) or die(mysql_error());
$rows = mysql_num_rows($result);
if ($row !== 0) then
    die("Not unique");
}

Кроме того, ваш оператор запроса выглядит синтаксически правильным. Почему бы не посмотреть, что он возвращает?

$row = mysql_fetch_assoc($result);
var_dump($row);

и посмотрите, что именно соответствует. Может быть, у вас нет этого значения в таблице, и вы ошибаетесь, думая, что оно там.

0 голосов
/ 18 июня 2011

Вы используете "table_name" также для БД. Это правильно? В противном случае mysql_select_db () завершится ошибкой, и любой запрос тоже не удастся, потому что БД не выбрана.

0 голосов
/ 18 июня 2011
Select count(*) from yourtable where mycolumn = 'unique string'

Теперь вы должны проверить, вернул ли это 1

...