2017-01-27 13 views
3

これはtrueを返しますが、それはテーブルを切り捨てませんでした:MySQLでプリペアドステートメントを使用してテーブルを切り詰めるには?

$this->db->query("TRUNCATE TABLE $tablename"); 

しかし、それは、プリペアドステートメントのためのデータベース接続オブジェクトを作成する前に動作します。

修正方法?また、準備されたステートメントを使用してテーブルを切り詰める方法も知りたい。

+0

http://stackoverflow.com/questions/11312737/can-i-parameterize-the-table-name-in-a-prepared-statement – Sean

+0

を参照してください。なぜ、デフォルトのdbクエリの実行が「$ this-> db-> query "これは動作しませんでしたか?しかし、それはtrueを返しますが、テーブルには影響しません!! – Karan

+0

私の答えを更新しました。一度お試しください – Deep

答えて

2

いいえ、準備された文は、テーブル名をバインドすることができないため解決策にはなりません。 したがって、Truncate Tableに対してprepared statementを使用しないでください。

SQLのリテラルはバインドできません。データは1つです。したがって、キーワード、演算子、および任意の識別子は、プリペアドステートメントを使用してバインドすることはできません。データはバインドのみできます。

PDOプリペアドステートメントは、ユーザー入力をサニタイズするためにバインドされたパラメータなどの機能を使用できるように、ユーザー入力でクエリを実行する場合に便利です。

私の提案では、truncate tableにprepared statementを使用しないでください。

あなたが本当にコードを使用し、使用しているOpencartの場合は、準備された使用して切り捨てる場合:

$sql = sprintf('TRUNCATE TABLE %s%s', DB_PREFIX, $table); 
$this->db->query($sql); 

一度これを試してみて、私はあなたができる、TRUNCATE TABLEについて

+0

ok。貴重な情報をありがとう。しかし、このクエリはtrueを返します。私は準備されたstamentのためのオブジェクトを作成した後、テーブルに影響を与えませんでした..なぜですか? – Karan

+0

質問がありません...テーブルを切り捨てる必要がありますか? – Deep

+0

いいえ、テーブルを切り捨てませんでした。これは上記のコードの結果です.TRUNCATE TABLE tablename bool(true)..しかし、dbで直接クエリを実行すると、それは動作します。 – Karan

2

をお知らせまだPDO::preparePDOStatement::executeの両方を使用します。

悲しいこと
$tablename = 'tblName'; 
$PDOStatement = $PDO->prepare("TRUNCATE TABLE $tablename;"); 
$PDOStatement->execute(); 

、名前付きを使用することはできません(:name)または疑問符(?)パラメータマーカー。ただし、TRUNCATEに関しては、通常、準備されたステートメントが意図されているクエリほど頻繁に使用しません。

関連する問題