проверка наличия данных в таблице - PullRequest
1 голос
/ 03 августа 2009

Как мне изучить таблицу и найти, существует ли строка. Задняя горунда за этим столом называется врагом. Каждая строка имеет уникальный идентификатор и имеет значение auto_increment. Каждая строка также имеет уникальное значение, называемое monsterid. идентификатор монстра не auto_increment.

когда монстр умирает, строка удаляется и заменяется новой строкой. поэтому идентификатор всегда меняется. также изменен и монстер.

Я использую в php метод $ _GET, и монстер проходит через него, в основном я пытаюсь сделать это

$ monsterID = 334322 // это идентификатор, переданный через $ _GET

checkMonsterId = "проверить, существует ли идентификатор монстра в таблице врагов"

если монстерид существует, то
{RUN PHP}

еще
{RUN PHP}

Если вам нужна дополнительная ясность, пожалуйста, спросите. и заранее спасибо за помощь.

Ответы [ 4 ]

6 голосов
/ 03 августа 2009

Используйте count! Если он возвращает> 0, он существует, в противном случае он не существует.

select count(*) from enemies where monsterid = 334322

Вы можете использовать его в PHP таким образом (после подключения к базе данных):

$monsterID = mysql_real_escape_string($monsterID);
$res = mysql_query('select count(*) from enemies where monsterid = ' . $monsterid) or die();
$row = mysql_fetch_row($res);
if ($row[0] > 0)
{
    //Monster exists
}
else
{
    //It doesn't
}
0 голосов
/ 04 августа 2009

Проще:

выберите 1 из врагов, у которых monsterid = 334322

Если он возвращает строку, у вас есть строка, если нет - нет.

0 голосов
/ 03 августа 2009

Используйте счетчик, как

выберите количество (*) врагов, у которых monsterid = 334322

Однако убедитесь, что вы добавили в таблицу индекс monsterid. Причина в том, что если вы этого не сделаете, а это не первичный ключ, то rdbms будет вынужден выполнить полное сканирование таблицы - прочитать каждую строку - чтобы вернуть вам значение. Для небольших наборов данных это не имеет значения, так как таблица, вероятно, все равно будет лежать в ядре, но как только число строк становится значительным, и вы нажимаете диск, чтобы выполнить сканирование, разница в скорости может легко составить два порядка или более.

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

Если вы выполняете более сложные запросы к базе данных, используя подвыбор, например, находя все места, где нет монстров, тогда посмотрите на использование предложения sql EXISTS. Это часто упускается из виду программистами (искушение состоит в том, чтобы вернуть счетчик фактических значений), и его использование обычно происходит быстрее, чем альтернативы.

0 голосов
/ 03 августа 2009

mysql_real_escape_string важен для предотвращения SQL-инъекций .

$monsterid = mysql_real_escape_string($_GET['monsterid']);
$query = intval(mysql_query("SELECT count(*) FROM enemies WHERE monsterid = '$monsterid'));
if (mysql_result > 0) {
    // monster exists
} else {
    // monster doesn't exist
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...