2

forループを使用して複数の挿入(4レコード)があります。次に、pathway_allowed = 'y' の場所に挿入されたレコードに対して更新クエリを実行したいと思います (4 つのうちの 1 つだけがこの値を持ちます)。ここでは last_insert_id() が役立つと思いますが、これを使用して次のように挿入されたレコードを更新する方法がわかりません。

$pathway_allowed = intval($_POST['allowed']);
$action = mysql_real_escape_string($_POST['actions']);

if(isset($_POST['submit'])){ 

$pathway_comment = array();
foreach($_POST['comment'] as $comment) {
    $pathway_comment[]= mysql_real_escape_string($comment);
}
for($i=0, $count = count($pathway_comment);$i<$count;$i++) {
    $comment = $pathway_comment[$i];
    $query = sprintf(
        "INSERT INTO pathway (             
           pathway_pk,
           case_fk,
           level,
           pathway_action_fk,
           pathway_allowed,
           comment
        ) VALUES (
           '',
           '$case_pk',
           '1',
           '$action',
           '%s',
           '$comment')", $pathway_allowed === $i ? 'y' : 'n');

       $result = mysql_query($query, $connection) or die(mysql_error());
}
if($result){
- SELECT the 4 records here...
}
}
4

2 に答える 2

1

mysql_connect拡張機能はPHP5.5.0で非推奨になり、将来削除される予定です。代わりに、MySQLiまたはPDO_MySQL拡張機能を使用する必要があります。詳細については、MySQL:APIガイドの選択および関連するFAQも参照してください。この関数の代替には、PDOとmysqli_connect()が含まれます。

PDOを使用している場合は、これを使用できます。

$dbh = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');

そしてforループであなたはこのようなことをします:

$stmt = $dbh->prepare("INSERT INTO test (name, email) VALUES(?,?)");
$tmt->execute( array('user', 'user@example.com'));
$inserted_ids[] = $dbh->lastInsertId(); 

ループの後に、4つのIDが挿入された配列が作成されます

編集:入力した値を再選択する必要はありません。これを使用できます

IN FOR LOOP
{
    $stmt = $dbh->prepare($query = sprintf("INSERT INTO pathway (pathway_pk,case_fk,level,pathway_action_fk,pathway_allowed, comment)
    VALUES (
       '',
       '$case_pk',
       '1',
       '$action',
       '%s',
       '$comment')", $pathway_allowed === $i ? 'y' : 'n'););

        // change the values to bindParam 

    $stmt->execute( array('user', 'user@example.com'));
    $data[$i]['pathway_pk'] = $dbh->lastInsertId(); 
    $data[$i]['case_fk'] = $case_pk;
    $data[$i]['level'] = 1;
    $data[$i]['pathway_action_fk'] = $action;
    $data[$i]['pathway_allowed'] = %s;
    $data[$i]['comment'] = $comment;

}

それから

foreach($data as $d){

    echo $d['pathway_pk'];
    echo $d['case_fk'];


}
于 2013-03-04T02:40:18.883 に答える
1

ループの反復ごとmysql_insert_id()に、 を配列に格納します。これを後で使用して、新しいレコードを選択できます。ここで、増分forループをより整然としたものに置き換えていることに注意してくださいforeach

// Initialize arrays for later
// one for the new ids
$inserted_ids = array();
// one to keep comments from failed queries
$failed_comments = array();
// and one for the MySQL errors of failed queries
$errors = array();

foreach ($pathway_comment as $comment) {
    $query = sprintf(
        "INSERT INTO pathway (             
           pathway_pk,
           case_fk,
           level,
           pathway_action_fk,
           pathway_allowed,
           comment
        ) VALUES (
           '',
           '$case_pk',
           '1',
           '$action',
           '%s',
           '$comment')", $pathway_allowed === $i ? 'y' : 'n');

       $result = mysql_query($query, $connection);

       // If the iteration was successful, save the insert id onto an array
       // but only if $pathway_allowed == 'y'
       if ($result) {
           if ($pathway_allowed == 'y') {
               $inserted_ids[] = mysql_insert_id();        
           }
       }
       // Otherwise, keep an array of comments that failed
       // Maybe useful later if you want to print those that failed
       else {
           $failed_comments[] = $comment;
           // And keep the mysql_error() as well.
           $errors[] = mysql_error();
       }
}
// Loop is done, now you can implode() the inserted ids array:
// These are all ints from an auto_increment PK, so no additional escaping needed
// Execute the query than do whatever you need with the newly inserted rows.
$query = "SELECT * FROM pathway WHERE pathway_pk IN (" . implode(",", $inserted_ids) . ")";

聞いたことがあるかもしれませんが、長期的には、MySQLi や PDO などの準備済みステートメントをサポートする API に切り替えることを検討してください。ここで、必要なエスケープと整数のキャストをすべて実行しましたが、準備済みステートメントは、エスケープを必要としないことに加えて、コンパイルしてループで実行するとより高速になります。

于 2013-03-04T02:27:49.107 に答える