Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: формирование строк через обход многомерного массива

Сообщения:  [1-10]    [11-20]   [21-30]   [31-40]   [41-50]  [51-51] 

 
 автор: confirm   (20.10.2012 в 20:13)   письмо автору
 
   для: dozent   (20.10.2012 в 20:02)
 

Нет у вас никакого ООП по большому счету. Но не в этом дело.
Не сможете научиться видеть задачу, разбивать ее на составляющие, и только потом находить для нее инструменты, значит так и останетесь на стадии "пока". Ваш код это полный бардак, в котором добрая часть лишнее, именно потому, что это не решение задачи, которую вы не видите, а куски по наитию.

  Ответить  
 
 автор: dozent   (20.10.2012 в 20:02)   письмо автору
 
   для: confirm   (20.10.2012 в 18:44)
 

Абыдно, да...:(((
Вообще, это меня один знакомый попросил. У них сайт какой-то христианской общины и когда происходят какие-нибудь события (встречи, приезды деятелей, праздники там всякие) они выкладывают фотки с этих мероприятий на сайт в фотогалерею. По существу это, как вы и писали свалка, фотки ни к чему не привязаны, просто добавленные последними отображаются первыми. Вот и всё. С заливкой всего этого дела на хостинг у них проблеммы (университетов тоже не кончали, с компами не на ты). Вот он и попросил сделать ему что-то вроде панели админа с возможностью загрузки файлов (чтоб просто выбрал их в полях, добавил подпись и ткнул "Закачать", а дальше всё само). Смею надеяться, что с поставленной задачей я справился: фотки сохраняются, миниатюры делаются и всё это вместе с подписями заносится в базу, о чем вылезает уведомление. Выполняется проверка на соответствие mime-типа файлов и на недопустимость повтора имён в директории.
Конечно код не идеален, так я и не проффи... пока. Хотелось бы улучшить , я надеюсь, это впереди!
А ООП я использовал не из-за восторженных чувств, а потому что не знаю как еще предать переменные (в моём случае массивы) из одной функции в другую, кроме как через свойства класса.

  Ответить  
 
 автор: confirm   (20.10.2012 в 18:44)   письмо автору
 
   для: dozent   (20.10.2012 в 18:14)
 

Бардак какой-то, а не код, что еще можно сказать. Вы втюрились в объекты, ради объектов, при этом совсем не понимая многих вещей. У вас нет решения задачи вашей, у вас склеивание кусов чего-то, в чем вы сами путаетесь. У вас даже именование переменных совсем не отражают их сути.

Еще раз напоминаю - вы не ответили не на один поставленный вам вопрос. А ведь загрузка файлов, которые требуют проверки и реакции на эту проверку, да еще сопутствующих данных для этих файлов, это диалог с пользователем в первую очередь. У вас его нет. У вас вообще ничего нет по большому счету, сейчас вы что-то сляпали, заработало, на том и остановились.

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

Вот этого у вас как раз и нет - понимания.

  Ответить  
 
 автор: 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.
Скажите, теперь всё правильно?

  Ответить  
 
 автор: confirm   (20.10.2012 в 17:03)   письмо автору
 
   для: 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//проверяем, вот так должны выглядеть строки параметров запроса,
 //а не так как вы над ними издеваетесь.                           

  Ответить  
 
 автор: dozent   (20.10.2012 в 16:46)   письмо автору
 
   для: 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 ???
Не объясните, где я туповат?

  Ответить  
 
 автор: confirm   (20.10.2012 в 15:50)   письмо автору
 
   для: 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 выражение после вашего экранирования?

  Ответить  
 
 автор: dozent   (20.10.2012 в 13:56)   письмо автору
 
   для: 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-запрос сформирован корректно, но записи в базу вставлены не были... Не могу постичь почему???

  Ответить  
 
 автор: confirm   (18.10.2012 в 20:29)   письмо автору
 
   для: dozent   (18.10.2012 в 20:19)
 

Я вам уже говорил - классы в помойку (на время). Опишите всю задачу полностью, ведь вы на поставленные вам вопросы так и не ответили, а значит решаете задачу методом склеивания чего-то с чем-то, что вполне может вылиться в ошибку.
Напишите просто, обычном кодом, отрепетируйте, а уж только потом оформляйте хоть классами, хоть чем угодно.
Если caption это еще массив, то несложно его проверить. Расход памяти можно контролировать на каждом участке кода, если невозможно определить узкое место проверкой отдельных данных.

  Ответить  
 
 автор: dozent   (18.10.2012 в 20:21)   письмо автору
 
   для: confirm   (18.10.2012 в 20:18)
 

$caption - это массив содержащий подписи к изображениям (короткие строки текста).

  Ответить  

Сообщения:  [1-10]    [11-20]   [21-30]   [31-40]   [41-50]  [51-51] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования