0

約 11 人の出席を取るフォームを作成しました。データベースに毎日の出席を挿入する必要があります。従業員ごとに 11 の異なるクエリを記述するのではなく、1 つのクエリを使用してすべての従業員の出席を一度に挿入したいと考えています。私のテーブル構造は次のようになります:attendance(date,eid,ename,attendance) 一括挿入のために次のコードを試しましたが、うまくいきませんでした。助言がありますか??

<?php
    $dbhost = "localhost";
    $dbuser = "root";
    $dbname = "gail";

    $conn = mysql_connect($dbhost, $dbuser,"") or die ('Error connecting to mysql');
    mysql_select_db($dbname);
    $dbh->beginTransaction();

    $stmt = $dbh->prepare("INSERT INTO attendance VALUES (curdate(),'$_POST[eid]','$_POST[ename]','$_POST[pora]')");

    foreach($valuesToInsert as $insertRow)
    {   

        // now loop through each inner array to match binded values
        foreach($insertRow as $column => value)
        {
            $stmt->bindParam(":{$column}", value);
            $stmt->execute();
        }
    }


    $dbh->commit();
?>

私もこれを試しました:

<?php

    $dbhost = "localhost";
    $dbuser = "root";
    $dbname = "gail";

    $conn = mysql_connect($dbhost, $dbuser,"") or die ('Error connecting to mysql');
    mysql_select_db($dbname);

    $employees=array();

    while($row=mysql_fetch_assoc($result))
    {
        $employees[$row["eid"]]=array("ename"=>$row["ename"]);
        $employees[$row["eid"]][$row["dated"]]=array();
        $employees[$row["eid"]][$row["dated"]][$row["ename"]]=$row["pora"];
        $inserts = array();
        foreach($employees as $v)
        {
            $inserts[] = "(curdate(),'$_POST[eid]','$POST[ename]','$POST[pora]')";

            $query = "INSERT INTO attendance VALUES ". implode(", ", $inserts);

            echo "query = $query"; // for debugging purposes, remove this once it is working
            mysql_query($query) or die(mysql_error());
        }
    }


?>

しかし、これはテーブルに現在の日付を何度も挿入するだけです。助けてください。よろしくお願いします:)

私はこれをもう1つやりました。必要な行数とまったく同じ数の行をデータベースに挿入しますが、すべて空白です。それに対処する方法についてのアイデアはありますか?

html ファイル:

ビームラインIDの流れ

ビームラインIDの
流れ

ビームラインIDの流れ

ビームラインIDの流れ

ビームラインIDの流れ

php:

 <?php
    $dbhost = "localhost";
    $dbuser = "root";
    $dbname = "gail";

    $conn = mysql_connect($dbhost, $dbuser,"") or die ('Error connecting to mysql');
    mysql_select_db($dbname);

    $cnt = count($_POST['bline_id']);
    $cnt2 = count($_POST['flow']);

    if ($cnt > 0 && $cnt == $cnt2) {
        $insertArr = array();
        for ($i=0; $i<$cnt; $i++) {
            $insertArr[] = "('" . mysql_real_escape_string($_POST['bline_id'][$i]) . "', '" .        mysql_real_escape_string($_POST['flow'][$i]) . "')";
        }

        $query = "INSERT INTO bltest (bline_id, flow) VALUES " . implode(", ", $insertArr);
        mysql_query($query) or trigger_error("Insert failed: " . mysql_error());
    }

    echo("<pre>\n");  
    print_r($_POST);
    echo("</pre>\n");
    mysql_close($conn); 
?> 
4

3 に答える 3

0

やっと手に入れた!cide が 1 ブロックしかないフォームから複数の値を挿入する必要がある場合は、フォローしてください。乾杯: :)

<?php

$dbhost = "localhost";
$dbuser = "root";
$dbname = "gail";

$conn = mysql_connect($dbhost, $dbuser,"") or die ('Error connecting to mysql');
mysql_select_db($dbname);

$cnt = count($_POST['eid']);
$cnt2 = count($_POST['ename']);
$cnt3 = count($_POST['pora']);

if ($cnt2 > 0 ) {
$insertArr = array();
for ($i=0; $i<$cnt2; $i++) {
    $insertArr[] = "(curdate(),'" . mysql_real_escape_string($_POST['eid'][$i]) . " ','" . mysql_real_escape_string($_POST['ename'][$i]) . " ','" .   mysql_real_escape_string($_POST['pora'][$i]) . "')";
      }

 $query = "INSERT INTO attendance (dated,eid,ename,pora) VALUES " . implode(", ",     $insertArr);
 mysql_query($query) or trigger_error("Insert failed: " . mysql_error());
 }

echo("<pre>\n");
print_r($_POST);
echo("</pre>\n");

mysql_close($conn);
?>
于 2013-07-11T13:33:27.263 に答える
-1

あなたはあなたのforeach()ループで正しい軌道に乗っています。変更する主な点は 2 つあります。単一のクエリを作成したいので (従業員ごとのクエリではなく、ループの前にクエリを開始します。

$query = "INSERT INTO `attendance` (`field1`, `field2`, `field3`) VALUES ";
foreach ($employees as $v)

次に、ループの各反復内で従業員固有のフィールドをクエリに追加します。MySQL の挿入を避けるために、入力をエスケープする必要があることに注意してください。mysql_real_escape_string()はこれを行う 1 つの方法ですが、おそらく PDO パラメーター化されたクエリを使用して、より堅牢なソリューションを実装することを検討する必要があります。

foreach($employees as $v)
{
    $inserts[] = "(curdate(), '"
        . mysql_real_escape_string($_POST['eid'])
        . "', '" . mysql_real_escape_string($_POST['ename'])
        . "', '" . mysql_real_escape_string($_POST['pora']) . "')";
}

次に、個々の挿入をクエリに追加します。

$query .= implode(",", $inserts);

これにより、次の形式でクエリが生成されます。

INSERT INTO `attendance` (`field1`, `field2`, `field3`) VALUES 
    (curdate(), 'id1', 'ename1', 'pora1'),
    (curdate(), 'id2', 'ename2', 'pora2'),
    (curdate(), 'id3', 'ename3', 'pora3')

最後に、データベース クエリからデータを取得するか、データベース クエリからデータを取得するかに関して、コードに多少の混乱があり$_POSTます。$_POSTデータがクエリから取得された場合は、データへの参照をデータの正しい場所に置き換えます。

于 2013-07-10T15:51:03.907 に答える
-2

最近、PHP で動的 SQL クエリを学び始めるすべての人のために、チェックリストを作成することができました。テキスト 1 に進む前に、すべての項目を完了する必要があります。

  1. まず、データベースはデータを格納するように設計する必要があります。
  2. 完了したら、どのクエリが挿入の目的に役立つかを決める必要があります。
  3. 次に、このクエリを手動で記述し、コンソールで動作することを確認します
  4. 次のステップは、このクエリに必要なデータを決定することです
  5. 次に、持っているデータを検証し、(4) に適合するかどうかを判断する必要があります。
  6. そうでない場合 - (4) の要件を満たすように既存のデータをフォーマットする必要があります
  7. 取得したらすぐに、文字列連結を使用してクエリを動的に作成し、結果をエコー出力する PHP プログラムの作成を開始できます。
  8. 次に、(3) のように、この動的に構築されたクエリをコンソールでテストする必要があります。
  9. 機能する場合は、クエリ内の変数をプレースホルダーに置き換え、mysqli の準備済みステートメントを使用して、単一のデータ セットでこのクエリを実行します。ネイティブのプリペアド ステートメントを使用する場合、プレースホルダーは単一のデータ リテラルのみを表すことができることに注意してください。
  10. それが終わったら、準備されたステートメントに複数の値を与える問題について、最終的に研究を開始することができます。
于 2013-07-10T15:29:03.100 に答える