するmysql_query対のsprintf()()
-
26-09-2019 - |
質問
私は、コードを実行すると、私はこのエラーを取得するのsprintf()を使用して、エラーなしで実行するために私のコードをフォーマット悩みを持つ:解析エラー:構文エラー、予期しないT_VARIABLE中/ライン16上の場所
$query = sprintf('UPDATE `%s` SET `stock` = :amount WHERE `itemname` = '$q'', $tablename);
上記は私のコードの行16です。私はそれが構文関連していると仮定しています。
私は今、次のエラーが発生します
致命的なエラー:メッセージでキャッチされない例外 'PDOException「SQLSTATE [42000]:構文エラーまたはアクセス違反:1065クエリは、空であった」スタック/home/content/63/6563663/html/inventory/pg.php:19にトレース:#0 /home/content/63/6563663/html/inventory/pg.php(19):PDOStatement->実行()#1 {メイン}内/家庭スロー/コンテンツ/ 6563663分の63 / HTML /インベントリ/ライン19上のpg.php
これは私の全体のコードブロックです。
<?php
$u=$_GET["u"];
if ((isset($_POST["MM_update"])) && ($_POST["MM_update"] == "form2")) {
$amount = isset($_POST['amount']) ? $_POST['amount'] : null;
if (null != $amount) {
$user = 'username';
$pass = 'password';
$pdo = new PDO('mysql:localhost', $user, $pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
session_start();
$tablename = $_SESSION['MM_Username'];
$query = sprintf('UPDATE %s SET stock= :amount WHERE itemname= '.$u, $tablename);
$stmt = $pdo->prepare($UpdateQuery);
$stmt->bindParam('amount', $amount);
$stmt->execute();
}
}
?>
ありがとう、私のエラーはPDOの実行ではなく、クエリ自体を扱っているようです。誰もがその上の任意のアイデアを持っている場合、それは素晴らしいことです。アラン、私は()引用符のためのあなたの方法を使用してもmysql_real_escape_stringの通過クエリを実行しています。
正しい解決策はありません
他のヒント
SQL変数のうち照会構築しないでください。使用して、変数をバインドします。
を参照してください。 http://bobby-tables.com/php.htmlする
これを試してみてください
$query = sprintf('UPDATE
%sSET
stock= :amount WHERE
itemname= '.$q, $tablename);
あなたは文字列と一緒にそれらを結合するための変数間の連結演算子を配置する必要があります。それはすべての文字列を変更していないので、あなたはまた、''
後$q
を取り除くことができます。
編集ます:
私は何をしようとする読み違えると信じています。代わりにこれを試してください:
$query = sprintf("UPDATE
%sSET
stock= :amount WHERE
itemname= '$q'", $tablename);
二重引用符内になるようにPHPの文字列を変更することにより、あなたは、単一引用符をエスケープする必要はありませんし、$ qはその値に展開されます。
また、必ずあなたはSQLインジェクションを防ぐためにmysql_real_escape_string()
を通じて$ Q $とテーブル名を実行していること。
のようなので:
$query = sprintf('UPDATE `%s` SET `stock` = :amount WHERE `itemname` = \'$q\'', $tablename);
または
$query = sprintf("UPDATE `%s` SET `stock` = :amount WHERE `itemname` = \'$q\'", $tablename);
あなたは'
で区切られた文字列にエスケープされていない'
sを持つことはできません。 "
で区切られた文字列でエスケープ"
sどちらか。文字列をエスケープするあなたは\
の文字を付加する必要が区切ります。