Ответ 1
На странице mysql:
Основная идея состоит в том, чтобы вставить записи, используя оператор
ignore
. Если вы используете ключевое слово IGNORE, ошибки, возникающие во время выполнения Инструкция INSERT обрабатываются как предупреждения. Например, без IGNORE, строка, которая дублирует существующий индекс UNIQUE или PRIMARY KEY значение в таблице вызывает ошибку с повторяющимся ключом, и оператор прервана. С IGNORE строка все еще не вставлена, но ошибка не возникает выпущен. Затем верните последний идентификатор, используяmysql_insert_id
Если запись не существует, она вставляет ее, и последний идентификатор будет возвращен.
Теперь, если запись не возвращена, вы можете сделать свой выбор. Это означает, что запись уже существует, поэтому просто используйте ее.
Пример:
// make sure $id is safe (preventing sql injections)
$sql = "INSERT IGNORE INTO yourtable SET `field1` = 'value1' ... ";
mysql_query($sql);
if(mysql_affected_rows() == 1) { // no record found and then the inserts worked
$id = mysql_insert_id(); // id from the primary key
// add to cache
}
else {
// you can also cache them when they were inserted (faster to run than a select statement)
$id = retreiveFromCache($field1, $field2 /* etc...*/);
if(!$id) { // no record found in cache
// now the select can be done using the fields received
// make sure your use the right index otherwise it can be slow
$sql = "SELECT id FROM promotions_referrals WHERE `field1` = 'value1' ... "; //
$query = mysql_query($sql);
$row = mysql_fetch_assoc($query);
$id = $row['id'];
// add to cache
}
}
В этот момент у вас будет $id
, и вы уверены, что нет ошибок duplicate/mysql.
Примечание. Если домен принадлежит одному клиенту, используйте идентификатор клиента вместо использования домена. Таким образом, вы будете использовать INT как индекс, который быстрее, чем VARCHAR. Такая же идея для реферального кода.