снова возникли трудности из-за моей нужности. Я не знаю, выполняю ли я это правильно, но мне нужно отправить переменную id с массивом через цикл foreach в mysql db. Если это не имеет никакого смысла, то, вероятно, из-за моей неспособности сформулировать с техническим жаргоном, так что просто отправьте код. Просмотрите примечания в коде PHP.
Любая помощь всегда ценится.
Cheers, Lea
FORM:
<form method="post" action="<?php echo $PHP_SELF; ?>" enctype="multipart/form-data">
<?php
$num = 0;
while($num < $num_uploads)
{
?>
<input type="hidden" name="item_id[]" value="<?php echo $stockno; ?>" />
<input type="file" id="myfile" name="userfile[]" size="40">
<?php $num++;
}
?>
<input type="submit" name="Preview" value="Preview" />
</form>
PHP скрипт:
if(isset($_POST['Preview']) ) {
// START PHOTO QUERY
if(isset($_FILES['userfile']['tmp_name']))
{
/** loop through the array of files ***/
for($i=0; $i < count($_FILES['userfile']['tmp_name']);$i++)
{
// check if there is a file in the array
if(!is_uploaded_file($_FILES['userfile']['tmp_name'][$i]))
{
$messages[] = 'No file uploaded';
}
/*** check if the file is less then the max php.ini size ***/
elseif($_FILES['userfile']['size'][$i] > $upload_max)
{
$messages[] = "File size exceeds $upload_max php.ini limit";
}
// check the file is less than the maximum file size
elseif($_FILES['userfile']['size'][$i] > $max_file_size)
{
$messages[] = "File size exceeds $max_file_size limit";
}
else
{
// copy the file to the specified dir
if(@copy($_FILES['userfile']['tmp_name'][$i],$upload_dir.'/'.$_FILES['userfile']['name'][$i]))
{
/*** give praise and thanks to the php gods ***/
$messages[] = $_FILES['userfile']['name'][$i].' uploaded';
$name[] = $_FILES['userfile']['name'][$i];
$id[] = $_POST['item_id'];
// HAVING DIFFICULTIES HERE
foreach( $name as $value ) {
$sql = "INSERT INTO stock_photos (photo_filename) VALUES ('$value')";
mysql_query($sql);
foreach( $id as $val ) {
$sql2 = "UPDATE stock_photos SET photo_item_id = '$val' WHERE photo_filename = '$value'";
mysql_query($sql2) or die(mysql_error());
}
}
// END DIFFICULTIES HERE
}
else
{
/*** an error message ***/
$messages[] = 'Uploading '.$_FILES['userfile']['name'][$i].' Failed';
}
}
}
}
// END PHOTO QUERY
}
Я думаю, что у вас есть недостаток в вашей логике. Вы не хотите иметь вложенный цикл foreach
. Подумайте об этом:
Вы перебираете каждое имя файла. Для каждого имени файла вы перебираете все идентификаторы и обновляете идентификатор имени файла с каждым значением из массива идентификаторов. Вы в основном перезаписываете идентификатор в базе данных с каждым вызовом UPDATE
, в конечном итоге устанавливая значение в последнее значение массива $id
.
Таким образом, вы должны иметь петли один за другим.
Предполагая, что ваши $name
и $id
заполнены правильно, и оба содержат одинаковое количество элементов, вы можете сделать еще лучше, используя обычный цикл for
:
for($i = 0; $i < count($name); $i++ ) {
$sql = "INSERT INTO stock_photos (photo_filename, photo_item_id) VALUES ('". mysql_real_escape_string($name[$i]) . "', '" . mysql_real_escape_string($id[$i] . "')";
mysql_query($sql);
}
Примечание: Никогда не доверяйте пользовательскому вводу, поэтому принимайте меры предосторожности с помощью фильтрации и экранирования, как я сделал с mysql_real_escape_string()
.
Update:
И вы можете сделать еще лучше только с одним запросом MySQL, вставив сразу несколько значений:
function prepare($name, $id) {
return sprintf("'%s', '%s'",
mysql_real_escape_string($name),
mysql_real_escape_string($id));
}
$values = array_map('prepare', $name, $id);
$sql = 'INSERT INTO stock_photos (photo_filename, photo_item_id) VALUES (' . implode('),(', $values) . ')';
mysql_query($sql);