0

ファイルアップロードセクションのある基本的なフォームがあります。フォームを送信すると、DB には何も送信されません。x-debug でデバッグすると、$_POST 変数がすべて入力され、正しいことがわかります。

これは次の形式です。

<form id="classifiedsForm" enctype="multipart/form-data" action="{$self}" method="post" autocomplete="off">
        <fieldset>
            <label>Basic Details</label>
            <section>
                <label for="headline">Headline</label>
                <div><input type="text" id="headline"  name="headline" required title="A headline for your ad">
                </div>
            </section>
            <section><label for="img">Add an image<br><span>Image should be 300x300px and jpg or png. Don't worry. We do the curvy corners thing.</span></label>
                <div>
                    <input type="file" id="img" name="img">
                </div>
            </section>
            <section>
                <label for="description">Description</label>
                <div><input type="text" id="description"  name="description" required title="A description for your ad">
                </div>
            </section>
            <section>
                <label for="contact">Contact</label>
                <div><input type="text" id="contact"  name="contact" required title="A contact email address">
                </div>
            </section>
            <section>
                <label for="category">Category</label>
                <div>
                    <select name="category" id="country">
                        <optgroup label="Category">
                            {foreach item=c from=$categories}
                                <option name="category" value="{$c.name}">{$c.name}</option>
                            {/foreach}
                        </optgroup>
                    </select>
                </div>
            </section>
            <section>
                <label for="buySell">Sign up to newsletter?</label>
                <div>
                    <input type="radio" id="yes_radio" name="buySell" value="1"><label>Buy</label>
                    <input type="radio" id="no_radio" name="buySell" value="0"><label>Sell</label>
                </div>
            </section>
            <section>
                <div>
                    <button name="submit" class="submit" value="update" type="submit">Update</button>
                </div>
            </section>
        </fieldset>
    </form>

そして、これはコントローラーです:

include '../common.php';

session_start();

$userID = $_SESSION['email']['id'];


if(empty($_SESSION['email']))
{
header("Location: ../login.php");
die("Redirecting to login.php");
}

$title = 'Your Profile';


//CATEGORIES QUERY

try
{
$sql = "SELECT * FROM `categories` ORDER BY `name` ASC";

$result = $pdo->query($sql);
}
catch (PDOException $e)
{
$error = 'Error fetching classifieds: ' . $e->getMessage();
include '../includes/error.html.php';
exit();
}

foreach ($result as $row)
{
$categories[] = array(
    'id' => $row['id'],
    'name' => $row['name']);
}

if ($_SERVER['REQUEST_METHOD'] == "POST"){
try
{
    $sql = "INSERT INTO `classifieds` SET
    `headline` = :headline,
    `description` = :description,
    `contact` = :contact,
    `buySell` = :buySell,
    `category` = :category,
    `user_id` = $userID";

    $s = $pdo->prepare($sql);
    $s->bindValue(':headline', $_POST['headline']);
    $s->bindValue(':description', $_POST['description']);
    $s->bindValue(':contact', $_POST['contact']);
    $s->bindValue(':buySell', $_POST['buySell']);
    $s->bindValue(':category',$_POST['category']);
    $s->bindValue(':userID', $userID);
    $s->execute();
}
catch (PDOException $e)
{
    $error = 'Error adding advert.';
    include '../includes/error.html.php';
    exit();
 }
}

$smarty->assign('title', $title);
$smarty->assign('categories', $categories);
$smarty->assign('userID', $userID);
$smarty->display('add-classifieds.tpl');

そしてmysqlテーブル:

CREATE TABLE `classifieds` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `create_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `headline` varchar(255) NOT NULL,
  `img` varchar(255) DEFAULT NULL,
  `description` varchar(255) NOT NULL,
  `contact` varchar(255) NOT NULL,
  `buySell` int(1) NOT NULL,
  `category` varchar(255) NOT NULL,
  `user_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `user_id` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=39 DEFAULT CHARSET=latin1;

これに関するヘルプは大歓迎です。ありがとう。

4

2 に答える 2

7
$sql = "INSERT INTO `classifieds` SET
`headline` = :headline,
`description` = :description,
`contact` = :contact,
`buySell` = :buySell,
`category` = :category,
`user_id` = $userID";

最後の行は正しくありません:userID。ただし、それからエラーが発生するはずです(Number of variables doesn't match number of parameters in prepared statement)。

開発モードでは、例外メッセージをエコーする必要があります。

echo $e->getMessage();

そうすれば、すぐにこの解決策にたどり着くはずです。

于 2013-05-06T08:26:59.500 に答える
0

Sherlockは正しいですが、あなたの人生をより簡単にする何かを追加できれば....各変数を個別にバインドする代わりに、実行呼び出しに配列を直接渡すことができます.フォーム要素にdbと同じ名前を付けると次のようなことができます。

//make list of allowed POST form fields/db columns with matching names
$allowable_vars = array(
     'headline'
    ,'description'
    ,'contact'
    ,'buySell'
    ,'category'
);

//array flip turns values into keys
//array intersect key removes any POST values not in the allowed list
//but keeps the values of POST for the keys that do match

$post_vals = array_intersect_key($_POST,array_flip($allowable_vars));

//add any values not coming from POST or that do not match for some reason
$post_vals['user_id'] = $userID;

//prepare as normally would
$s = $pdo->prepare($sql);

//bind and execute at same time
$s->execute($post_vals);

列のプレースホルダーの前のコロンは、バインディング呼び出しの命名ではなく、クエリでのみ必要です...新しいフォームフィールドを追加する場合、追跡する必要がないため、許容可能なキーを使用すると、新しい列を追加するメンテナンスがはるかに簡単になります個々のバインディングはもうありません。

于 2013-05-06T08:50:56.333 に答える