1

データベース テーブルには、クエリが挿入しようとしている 4 つのフィールドのみが含まれています。何らかの理由で、次のエラーが表示されます: クエリが失敗しました: SQLSTATE[HY093]: 無効なパラメーター番号: パラメーターが定義されていません。

foreach ループの出力をエコーし​​てトラブルシューティングを行ったところ、常に 4 つの項目が返されました。どのパラメーターが定義されていないのかわかりません。また、 $sql 文字列にフィールド名を含めたり、含めなかったりして遊んでみました。どちらでも同じ結果です。できれば助けてください。

<?php
class DB {
        private $_conn;

        public function openDB() {
                $dsn = "mysql:host=localhost;dbname=news";
                $username = "root";
                $password = "password";

                try {
                        $this->_conn = new PDO( $dsn, $username, $password );
                        $this->_conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
                } catch ( PDOException $e ) {
                        echo "Connection failed: " . $e->getMessage();
                }
        }

        public function closeDB() {
                $this->_conn = null;
        }

        public function selectData( $myQuery ) {
                $rows = $this->_conn->query( $myQuery );

                foreach ( $rows as $row ) {
                        echo "Index: " . $row['id'] . "<br />";
                        echo "Title: " . $row['title'] . "<br />";
                }
        }

        public function insertData( $tableName ) {

                $q = $this->_conn->prepare("DESCRIBE " . $tableName);
                $q->execute();
                $getFields = $q->fetchAll(PDO::FETCH_COLUMN);

                $dbFieldCount = count( $getFields );
                $implodedFields = implode( ", :", $getFields );

                //$sql = "INSERT INTO " . $tableName . " ( " . implode( ", ", $getFields ) . " ) VALUES ( :" . $implodedFields . " )";
                $sql = "INSERT INTO " . $tableName . " VALUES ( :" . $implodedFields . " )";
                echo "$sql<br />";

                try {
                        $insert = $this->_conn->prepare( $sql );

                        foreach ( $getFields as $dbKey => $dbValue ) {
                                foreach( $_POST as $formKey => $formValue ) {
                                        if ( $dbValue == 'id' ) {
                                                $insert->bindValue( '\":' . $dbValue . '\"', null, PDO::PARAM_INT );
                                                echo "$dbValue<br />";
                                                break;
                                        } else if ( is_int( $formValue ) && $dbValue == $formKey ) {
                                                $insert->bindValue( '\":' . $dbValue . '\"', $formValue, PDO::PARAM_INT );
                                                echo "$formValue<br />";
                                                break;
                                        } else if ( is_string( $formValue ) && $dbValue == $formKey ) {
                                                $insert->bindValue( '\":' . $dbValue . '\"', $formValue, PDO::PARAM_STR );
                                                echo "$formValue<br />";
                                                break;
                                        }
                                }
                        }

                        $insert->execute();
                } catch ( PDOException $e ) {
                        echo "Query failed: " . $e->getMessage();
                }
        }

}
?>
<!DOCTYPE html>
<html>
        <head>
                <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
                <title></title>
        </head>
        <body>
                <?php

                if ($_POST) {
                        $conn = new DB();
                        $conn->openDB();
                        $conn->insertData( 'login' );
                        $conn->closeDB();
                }

                ?>

                <form action="#" method="POST" name="register">
                        <label for="username">Username</label><br />
                        <input type="text" id="username" name="username"><br />
                        <label for="password">Password</label><br />
                        <input type="password" id="password" name="password"><br />
                        <label for="email">Email Address</label><br />
                        <input type="text" id="email" name="email"><br />
                        <input type="submit" value="Submit" />
                </form>

        </body>
</html>
4

1 に答える 1

0
$sql = "INSERT INTO " . $tableName . " VALUES ( :" . $implodedFields . " )";

ここでは、すべての列をSQLステートメントに追加していますが、後でフォームが送信されたときに送信される値のみを追加します。データベースにフォームにない列がある可能性があるため、次のようなステートメントを考え出します。

INSERT INTO someTable VALUES (:id, :value1, :value2)

そして、あなたはバインド:idして:value1、MySQLが何:value2であるかについて混乱したままにするだけです。

于 2012-07-03T19:41:19.010 に答える