2013-11-18 4 views
0

У меня есть следующий SQL-оператор, написанный на PHP.есть лучший способ использовать mysql_insert_id()

$sql='INSERT INTO pictures (`picture`) VALUES ("'.$imgs[$i]['name'].'",)'; 
$db->query($sql); 
$imgs[$i]['sqlID']  = $this->id=mysql_insert_id(); 
$imgs[$i]['newImgName'] = $imgs[$i]['sqlID'].'_'.$imgs[$i]['name']; 
$sql='UPDATE pictures SET picture="'.$imgs[$i]['newImgName'].'" WHERE id='.$imgs[$i]['sqlID']; 
$db->query($sql); 

Теперь это записывает имя изображения в таблицы таблицы базы данных. После этого я получаю mysql_insert_id(), и я обновляю имя изображения с последним id перед именем с помощью подчеркивания.

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

Спасибо за все советы

+5

[Пожалуйста, прекратите использовать mysql_ * функции] (http://stackoverflow.com/q/12859942/1238019) в новом коде, они [официально устарели] (https://wiki.php.net/rfc/ mysql_deprecation). Вместо этого посмотрите [подготовленные заявления] (http://dev.mysql.com/doc/refman/5.0/en/sql-syntax-prepared-statements.html) и используйте [Mysqli] (http://php.net/manual/en/book.mysqli.php) или [PDO] (http://php.net/manual/en/book.pdo.php). – zessx

+0

Нет. Это лучший способ получить идентификатор. 'select max (id) + 1' является абсолютно ненадежным и подчиняется условиям гонки - вы получите столкновения. –

+2

Реальный вопрос: «вам действительно нужно скопировать первичный ключ таблицы в другое поле той же таблицы». – Vatev

ответ

1

Использование собственного auto_increment - другого способа не существует. Вам нужно сделать 3 описанных вами шага.

Как отметил Дан Бракус, вы можете создать хранимую процедуру для выполнения 3-х запросов (вы можете получить идентификатор вставки после его выполнения).

Другие возможные варианты:

  • не сохраняет идентификатор в имени файла - вы можете сцепить его позже, если вы хотите (при выборе)
  • с использованием одноранговой автоматического приращения вместо нативной - Я бы не рекомендовал его в этом случае, но это возможно
  • с помощью какой-то UUID вместо автоматического приращения
  • генерации уникальных имен файлов с помощью файловой системы (ответ Marcell Fulop в)
1

Я не думаю, что в данном конкретном случае это разумно использовать MySQL вставить Id в имени файла. В некоторых случаях это может потребоваться, но вы не указали, почему это было бы в этом.

Рассмотрим что-то вроде:

while(file_exists($folder . $filename) { 
    $filename = rand(1,999) . '_' . $filename; 
} 

$imgs[$i]['newImgName'] = $filename; 

Конечно, вы можете использовать больший диапазон для rand или счетчика цикла, если вы хотите TOT систематически увеличивать число, используемое в качестве префикса имя исходного файла.

+0

«Потому что все эти фотографии сохраняются в одной папке». вот почему. поэтому его часть имени файла в конце, и имена файлов должны быть уникальными. – caramba

+0

Код в ответе делает именно это - оставляет вас с уникальными именами файлов без использования идентификатора ввода. – marekful

+0

Теперь я вижу, спасибо, г-н Fülöp – caramba

Смежные вопросы