1

このクラスは、mysqli を介してデータベースを管理するためのものです。特定のテーブルのすべての列名を表示するために、準備されたステートメントにこだわっています。

class databaseManager {
    function showTable ($tableName, $mysqli) {
        $stmt = $mysqli -> prepare("SHOW COLUMNS FROM ?");
        $stmt -> bind_param('s', $tableName);
        $stmt -> execute();

        while ($stmt -> fetch) {
            $Field;
        }

        $stmt -> free_result();
    }
}

「非オブジェクトでメンバー関数 bind_param() を呼び出します」というエラーが表示されますが、$mysqli 接続が存在するため、mysqli -> 準備が間違っていると思われます。

編集:明らかに私は $mysqli を渡しました

$databaseManager = new databaseManager();
$databaseManager -> showTable("blog", $mysqli);
4

2 に答える 2

2

まず、エラー処理を行っていません。すべてのデータベースの相互作用の結果を常に確認してください。

例えば、

$stmt = $mysqli->prepare("SHOW COLUMNS FROM ?");
if (!$stmt) {
    throw new Exception($mysqli->error);
}

そのため、データベースからエラーメッセージが表示されます。

次に、プリペアドステートメントを介して識別子をバインドすることはできません。したがって、ドキュメント
によると、適切にフォーマットするためにホワイトリストに登録する必要があります

ちなみに、そのような機能にはあまり意味がありません。私はこの目的でコンソールを使用していますが、他の人は通常PHPMyAdminを介してデータベース構造を確認します

また、ベアAPIを使用することは最良の選択ではありません。抽象化レイヤーを使用することで、コードを1行で作成できます。

function showTable ($tableName) {
    return $this->db->getCol("SHOW COLUMNS FROM ?n", $tableName);
}

ただし、列名は常に結果セットに存在するため、テーブルの内容を表示するためにこのクエリは必要ありません。したがって、最初にデータをリクエストしてから、そこから列名を抽出するだけです。

上記のようなライブラリを使用すると、次のようになります。

$data  = $this->db->getAll("SELECT * FROM ?n", $tableName);
$names = array_keys($data[0]);

しかし、それでもPHPMyAdminの方がはるかに優れているので、試してみてください

ある種のオンラインテーブルエディタが必要な場合、それがそのようにまっすぐに機能することはめったにありません。データの前処理または後処理を必要とするいくつかの問題が常にあります。そして、どんな複雑なデータ構造でも、常に専用のコードになってしまいます。たとえば、素敵な列のタイトルを表示します。
しかし、いくつかのプレーンな文字列値では機能します。

于 2013-02-09T15:07:49.803 に答える
0

設計上、テーブル名と列名はパラメーター化できません。ただし、SQL インジェクションに対する最初の防御レベルとして、文字列に連結し、逆引用符で囲むことはできます。

    $stmt = $mysqli -> prepare("SHOW COLUMNS FROM `" . $tableName . "`");
    $stmt -> execute();
于 2013-02-09T15:01:34.410 に答える