Лучше сначала INSERT
, при условии, что имя пользователя не существует. Если какая-либо ошибка вызвана конфликтом дубликатов, SELECT
существующая строка.
<?php
$sql = "INSERT INTO users SET username = '"
. mysql_real_escape_string($username) . "'";
$query = mysql_query($sql);
if ($query === true) {
$userid = mysql_insert_id();
} else {
if (mysql_errno() != 1022) { // this is the duplicate key error code
die(mysql_error());
}
$sql = "SELECT id FROM users where username = '"
. mysql_real_escape_string($username) . "'";
$query = mysql_query($sql) or die(mysql_error());
$row = mysql_fetch_array($query);
if ($row !== false) {
$userid = $row["id"];
}
}
?>
Причина, по которой это лучше, заключается в том, что если вы выберете и вставите, кто-то другой может вставить имя пользователя в момент между вашими двумя операторами SQL.
Конечно, у вас должно быть ограничение UNIQUE
на users.username
.
Ваш комментарий: да, ваш сценарий должен быть быстрее. Когда нет повторяющегося имени пользователя (что, вероятно, более распространено), вам не нужно запускать SELECT
.
Лучший способ оптимизировать SQL-запрос - не запускать его вообще.