|
|
|
|
|
для: dozent
(20.10.2012 в 20:02)
| | Нет у вас никакого ООП по большому счету. Но не в этом дело.
Не сможете научиться видеть задачу, разбивать ее на составляющие, и только потом находить для нее инструменты, значит так и останетесь на стадии "пока". Ваш код это полный бардак, в котором добрая часть лишнее, именно потому, что это не решение задачи, которую вы не видите, а куски по наитию. | |
|
|
|
|
|
|
|
для: confirm
(20.10.2012 в 18:44)
| | Абыдно, да...:(((
Вообще, это меня один знакомый попросил. У них сайт какой-то христианской общины и когда происходят какие-нибудь события (встречи, приезды деятелей, праздники там всякие) они выкладывают фотки с этих мероприятий на сайт в фотогалерею. По существу это, как вы и писали свалка, фотки ни к чему не привязаны, просто добавленные последними отображаются первыми. Вот и всё. С заливкой всего этого дела на хостинг у них проблеммы (университетов тоже не кончали, с компами не на ты). Вот он и попросил сделать ему что-то вроде панели админа с возможностью загрузки файлов (чтоб просто выбрал их в полях, добавил подпись и ткнул "Закачать", а дальше всё само). Смею надеяться, что с поставленной задачей я справился: фотки сохраняются, миниатюры делаются и всё это вместе с подписями заносится в базу, о чем вылезает уведомление. Выполняется проверка на соответствие mime-типа файлов и на недопустимость повтора имён в директории.
Конечно код не идеален, так я и не проффи... пока. Хотелось бы улучшить , я надеюсь, это впереди!
А ООП я использовал не из-за восторженных чувств, а потому что не знаю как еще предать переменные (в моём случае массивы) из одной функции в другую, кроме как через свойства класса. | |
|
|
|
|
|
|
|
для: dozent
(20.10.2012 в 18:14)
| | Бардак какой-то, а не код, что еще можно сказать. Вы втюрились в объекты, ради объектов, при этом совсем не понимая многих вещей. У вас нет решения задачи вашей, у вас склеивание кусов чего-то, в чем вы сами путаетесь. У вас даже именование переменных совсем не отражают их сути.
Еще раз напоминаю - вы не ответили не на один поставленный вам вопрос. А ведь загрузка файлов, которые требуют проверки и реакции на эту проверку, да еще сопутствующих данных для этих файлов, это диалог с пользователем в первую очередь. У вас его нет. У вас вообще ничего нет по большому счету, сейчас вы что-то сляпали, заработало, на том и остановились.
А ведь этот диалог, загрузку, обработку, работу над ошибками, можно написать одним единственным циклом, даже без привлечения для этого функций! И в этом единственном проходе можно было разобраться, что лишнее, что необходимо добавить, найти места узкие. И только после это, с пониманием того, что вы делаете, можно уже писать нечто разделенное на фрагменты, если только в этом есть необходимость, или если эти фрагменты универсальны и могут использовать и в других местах.
Вот этого у вас как раз и нет - понимания. | |
|
|
|
|
|
|
|
для: confirm
(20.10.2012 в 17:03)
| | Сделал так:
<?
$host='localhost';
$db='church';
$user='changer';
$psw='writer';
$conn=new MySQLi($host,$user,$psw,$db) or die ('Невозможно открыть источник.');
foreach($_POST['caption'] as $index){
$caption[]=$index;
}
$files=$this->_files;
$mini=$this->_miniatures;
//if (count($files)==count($mini) && count($caption)<=count($mini)){
foreach ($files as $i=>$num){
$record1="'".mysqli_real_escape_string($conn,$num)."'";
$record2="'".mysqli_real_escape_string($conn,$mini[$i])."'";
$record3="'".mysqli_real_escape_string($conn,$caption[$i])."'";
$allrec[]="(".$record1.",".$record2.",".$record3.")";
}
$allrecords=implode(',',$allrec);
$sql="INSERT `church`.`images`(`files`,`mini`,`caption`) VALUES $allrecords";
mysqli_query($conn,$sql);// or die('запрос не выполнен.');
|
Работает!
$num - это не вложенный массив массива $files. $files, $mini и $caption - это одномерные массивы, содержащие: имена файлов изображений, миниатюр и подписи к ним; соответственно. Отсюда и необходимость (на мой взгляд) в ключе $i.
Скажите, теперь всё правильно? | |
|
|
|
|
|
|
|
для: dozent
(20.10.2012 в 16:46)
| | Вам сколько раз еще повторить, что экранировать надо данные, а не SQL выражение, чтобы вы это поняли? Если $num, это вложенный массив массива $files, то зачем ключ $i в его проходе?
<?
$allrec='';
foreach ($files as $num) $allrec .= "('".implode("','" array_map('mysql_real_escape_string', $num))."'),";
$allrec = rtrim($allrec, ',');
echio $allrec; //проверяем, вот так должны выглядеть строки параметров запроса,
//а не так как вы над ними издеваетесь.
|
| |
|
|
|
|
|
|
|
для: confirm
(20.10.2012 в 15:50)
| | Вобщем изменил код на такой:
<?
foreach($_POST['caption'] as $index){
$caption[]=$index;
}
$files=$this->_files;
$mini=$this->_miniatures;
if (count($files)==count($mini) && count($caption)==count($mini)){
$allrec='';
foreach ($files as $i =>$num){
$record1="'".$num."'";
$record2="'".$mini[$i]."'";
$record3="'".$caption[$i]."'";
$allrec[]="(".$record1.",".$record2.",".$record3.")";
}
$allrecords=implode(',',$allrec);
$host='localhost';
$db='church';
$user='changer';
$psw='writer';
$conn=new MySQLi($host,$user,$psw,$db) or die ('Невозможно открыть источник.');
//$allrecords=mysqli_real_escape_string($conn,$allrecords);
$sql="INSERT `church`.`images`(`files`,`mini`,`caption`) VALUES $allrecords";
mysqli_query($conn,$sql);// or die('запрос не выполнен.');
$r=mysqli_affected_rows($conn);
print($sql.$r);
}
|
Всё работает, записи вносятся в базу. Но если включить
<?$allrecords=mysqli_real_escape_string($conn,$allrecords);
| , то mysqli_affected_rows($conn); возвращает -1 ???
Не объясните, где я туповат? | |
|
|
|
|
|
|
|
для: dozent
(20.10.2012 в 13:56)
| | Вам говорили, и вы должны были прочесть о том, что функция real_escape_string(), это для обработки данных. А вы что обрабатываете?
<?
$s = '("aaa","bbb","ccc")';
echo mysql_real_escape_string($s).'<br>';
$s = '("'.mysql_real_escape_string('a"aa').'",
"'.mysql_real_escape_string('bbb').'",
"'.mysql_real_escape_string('ccc').'")';
echo $s.'<br>';
| Во что превратиться msql выражение после вашего экранирования? | |
|
|
|
|
|
|
|
для: confirm
(18.10.2012 в 20:29)
| | В принципе разобрался с обходом массива.
Задача была сформировать из трёх (или более) массивов строку вида:
('первый_элемент_первого_массива','первый_элемент_второго_массива','первый_элемент_третьего_массива'),('второй_элемент_первого_массива','второй_элемент_второго_массива','второй_элемент_третьего_массива') и т.д.
Сделал так:
<?
foreach($_POST['caption'] as $index){
$caption[]=$index;
}
$files=$this->_files;
$mini=$this->_miniatures;
if (count($files)==count($mini) && count($caption)==count($mini)){
$allrec='';
foreach ($files as $i =>$num){
$record1="'".$num."'";
$record2="'".$mini[$i]."'";
$record3="'".$caption[$i]."'";
$allrec.="(".$record1.",".$record2.",".$record3.")";
}
$host='localhost';
$db='church';
$user='changer';
$psw='writer';
$conn=new MySQLi($host,$user,$psw,$db) or die ('Невозможно открыть источник.');
$sql="INSERT `images`(`files`,`mini`,`caption`) VALUES ".$conn->real_escape_string($allrec);
$result=$conn->query($sql);
/*строка 108*/ $r=$result->affected_rows;
print($sql.$r);
|
Теперь друга проблемма.
На выходе получил:
Notice: Trying to get property of non-object in J:\xampp\htdocs\mysite\includes\FotoClass.php on line 108
INSERT `images`(`files`,`mini`,`caption`) VALUES ('Kir_1.jpg','Kir_1_thumb.jpg','первая подпись')('SS100357_20.jpg','SS100357_20_thumb.jpg','вторая подпись')
Т.е., насколько я вижу, SQL-запрос сформирован корректно, но записи в базу вставлены не были... Не могу постичь почему??? | |
|
|
|
|
|
|
|
для: dozent
(18.10.2012 в 20:19)
| | Я вам уже говорил - классы в помойку (на время). Опишите всю задачу полностью, ведь вы на поставленные вам вопросы так и не ответили, а значит решаете задачу методом склеивания чего-то с чем-то, что вполне может вылиться в ошибку.
Напишите просто, обычном кодом, отрепетируйте, а уж только потом оформляйте хоть классами, хоть чем угодно.
Если caption это еще массив, то несложно его проверить. Расход памяти можно контролировать на каждом участке кода, если невозможно определить узкое место проверкой отдельных данных. | |
|
|
|
|
|
|
|
для: confirm
(18.10.2012 в 20:18)
| | $caption - это массив содержащий подписи к изображениям (короткие строки текста). | |
|
|
| |
|