【问题标题】:Merging PHP arrays合并 PHP 数组
【发布时间】:2010-07-13 09:52:34
【问题描述】:

我现在正在做一个项目,它允许用户创建任意数量的新闻标题、文章和图片,这个系统的唯一规则是标题必须有文章和图片。我的问题在我的表单上,当我提交时我得到 2 个数组,一个是 $_POST,另一个是 $_FILES

$_POST

大批 ( [campaign_title] => 另一个多重测试 [campaign_keyword] => 另一个多重测试 [介绍] => 另一个多重测试 [campaign_headline] => 数组 ( [0] => 另一个多重测试标题 1 [1] => 另一个多重测试标题 2 ) [文章] => 数组 ( [0] => 另一个多重测试文章 1 [1] => 另一篇多重测试文章 2 ) [save_multiple] => 保存 )

$_FILES

大批 ( [article_image] => 数组 ( [名称] => 数组 ( [0] => 介绍艺术家.gif [1] => textbg1.png ) [类型] => 数组 ( [0] => 图片/gif [1] => 图片/png ) [tmp_name] => 数组 ( [0] => /private/var/tmp/phpwDAkGJ [1] => /private/var/tmp/phpmvrMDg ) [错误] => 数组 ( [0] => 0 [1] => 0 ) [大小] => 数组 ( [0] => 2841 [1] => 56506 ) ) )

基本上提交表单后的方法就是将数据存入数据库,post的3条存在一个表中,标题和文章存到另一个表中(用刚刚插入的行的id发送) 然后最后保存图像,再次发送第一个保存行的 id。

我无法理解如何确保使用正确的 ID 保存正确的图像,数据库保存是通过循环浏览标题和文章来完成的,但由于图像位于不同的数组中,我无法做到这一点并制作确定他们使用正确的外国 ID 保存,我可以将文件合并到帖子中吗?目前我对标题和文章的解决方案是这样的,

foreach ($data['campaign_headline'] as $key => $headline) {
    addMailerMultipleRelatedContent($mailerId, $headline, $data['article'][$key]);
}


function addMailerMultipleRelatedContent($mailerId, $headline, $article) {
    extract($data);
    //die(print_r($id));
    $id = addRelatedMultipleContent($data['introduction'], $headline, $article,
      $mailerId, mktime(), mktime());
}

function addRelatedMultipleContent($introduction, $headline, $content,
  $mailer_id, $created_at, $updated_at){
    $query = "INSERT INTO `mailer_content` (`id`, `introduction`, `headline`,
      `content`, `mailer_id`,`created_at`, `updated_at`) VALUES ";
    $query .= "(NULL, '" . makeSafe($introduction) . "', '" .
      makeSafe($headline) . "', '" . makeSafe($content) . "', '" .
      makeSafe($mailer_id) . "', " . makeSafe($created_at) . ", " .
      makeSafe($updated_at) . ");";
    $result = runInsert($query, __FUNCTION__);
    //die(print_r($result));
    return $result;
}

我可以同时处理图像吗?

编辑:

HTML 表单,

<form method="post" action="/admin/editmultiple" enctype="multipart/form-data">
                    <fieldset class="toplined">
                        <label>Campaign Title</label>
                        <input type="text" name="campaign_title" value="<?echo (isset($mailers['mailer_title'])) ?  $mailers['mailer_title'] :  $_POST['campaign_title'];?>" class="extrawideinput" />
                    </fieldset>
                    <fieldset class="toplined">
                        <label>Campaign Type:</label>
                        <label>Multiple</label>
                    </fieldset>
                    <fieldset class="toplined">
                        <label>Campaign Keyword:</label>
                        <div class="forminputblock">
                            <input type="text" name="campaign_keyword" value="<?echo (isset($mailers['mailer_header'])) ?  $mailers['mailer_header'] :  $_POST['campaign_keyword'];?>" class="extrawideinput" />
                        </div>
                    </fieldset>
                    <fieldset class="toplined">
                        <label>Introduction</label>
                        <div class="forminputblock">
                            <input type="text" name="introduction" value="<?echo (isset($mailers['introduction'])) ?  $mailers['introduction'] :  $_POST['introduction'];?>" class="extrawideinput" />
                        </div>
                    </fieldset>
                    <fieldset class="toplined">
                        <label>Headline</label>
                        <div class="forminputblock">
                            <input type="text" name="campaign_headline[]" value="<?echo (isset($mailers['headline'])) ?  $mailers['headline'] :  $_POST['campaign_headline'];?>" class="extrawideinput" />
                        </div>
                    </fieldset> 
                    <fieldset class="toplined">
                        <label>Image:</label>
                        <input type="file" name="article_image[]">
                    </fieldset>
                    <fieldset class="toplined">
                        <label>Story:</label>
                        <div class="forminputblock">
                            <textarea name="article[]" class="js_editable_textarea deeptext" rows="1" cols="1"><?echo (isset($mailers['content'])) ?  $mailers['content'] :  $_POST['article'];?></textarea>
                    </fieldset>
                    <div id="result">

                    </div>
                    <fieldset class="toplined">
                    <a href="" id="makeRequest">+ Add Another New Article</a>
                    </fieldset>
                    <fieldset class="toplined">
                    <input type="submit" name="save_multiple" value="Save" />
                    </fieldset>
                </form>

【问题讨论】:

  • 请发送一段 HTML 代码。通常关键是表单字段的命名。

标签: php arrays forms multipartform-data


【解决方案1】:

使用与访问文章子数组相同的键,您可以访问 $_FILES 数组中的不同字段。显然,您可以合并这两个数组,但您不必使用它们。

另外,您应该注意,您必须将实际数据从临时位置复制到您想要永久存储的位置。请务必使用 [is_uploaded_file()][1] 和 [move_uploaded_file()][2] 方法来防止通过文件上传进行的潜在攻击。

[1]:http://www.php.net/manual/en/function.is-uploaded-file.phpis_uploaded_file() [2]:http://www.php.net/manual/en/function.move-uploaded-file.phpmove_uploaded_file()

【讨论】:

    【解决方案2】:

    我不确定您是否要合并这两个数组,因为您需要对每个数组执行不同的操作。

    使用 $_FILES 数组,上传的图像将存储在一个临时位置,图像需要移动到更永久的位置,然后才能在您的数据库中引用。

    【讨论】:

      【解决方案3】:

      编辑:我刚刚为您重新编写了一个完整的示例,说明它如何轻松工作。 (以jquery为例)

      <?php
      echo '<pre>';
      print_r($_POST);
      
      echo '</pre>';
      
      ?>
      <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
      
      <script type="text/javascript">
      
      $(function() {
      
       var position = 1;
       $(".add").click(function(){
      
        var parent = $(this).parent();
        var newField = $(this).parent().clone(true).insertAfter(parent);
      
      
        /* title */
        var newName = 'articles['+ position + '][title]';
        newField.children(".name").attr("name", newName);
      
        /* content */
        newName = 'articles['+ position + '][content]';
        newField.children(".content").attr("name", newName); 
      
        /* content */
        newName = 'articles['+ position + '][checkbox]';
        newField.children(".checkbox").attr("name", newName); 
        newField.slideDown();
      
        position++;
      
       });
      
      
      });
      
      
      </script>
      <h1>example</h1>
      <form action="" method="post">
      
       <fieldset class="article">
        <label style="display:block">Article title</label>
        <input type="text" name="articles[0][title]" value="" class="name" />
      
        <label style="display:block">Article content</label>
        <textarea name="articles[0][content]" cols="40" rows="10"  class="content"></textarea>
      
      
        <label style="display:block">Checkbox</label>
        <input type="checkbox" name="articles[0][checkbox]" value="1" class="checkbox" />
      
        <br />
        <a href="#" class="add">add new after</a>
       </fieldset>
      
      
      
      
       <br />
      
       <input type="submit" value="submit" name="submit" />
      
      </form>
      

      【讨论】:

      • 不完全确定你为什么这样做,这是一个 PHP 问题
      • 因为你的 html 让事情变得比他们需要的要困难得多。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      • 2012-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多