Sprintf () مقابل mysql_query ()
-
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-> execute () #1 {main} تم إلقاؤه في /home/content/63/656363/html/inventory/pg.php على الخط 19
هذا هو كتلة الكود بالكامل:
<?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 من المتغيرات. استخدام متغيرات ربط.
جرب هذا:
$query = sprintf('UPDATE
٪سSET
مخزون= :amount WHERE
اسم العنصر= '.$q, $tablename);
تحتاج إلى وضع مشغل متسلسل بين السلاسل والمتغيرات لدمجها معًا. يمكنك أيضًا التخلص من ''
بعد $q
لأنه لا يغير السلسلة على الإطلاق.
تعديل:
أعتقد أنني أخطأت في قراءة ما تحاول القيام به. جرب هذا بدلاً من ذلك:
$query = sprintf("UPDATE
٪سSET
مخزون= :amount WHERE
اسم العنصر= '$q'", $tablename);
من خلال تغيير سلسلة PHP الخاصة بك لتكون ضمن عروض أسعار مزدوجة ، لا تحتاج إلى الهروب من اقتباساتك الفردية ، وسيتم توسيع $ Q إلى قيمتها.
تأكد أيضًا من قيامك بتشغيل $ Q و $ tablename mysql_real_escape_string()
لمنع حقن SQL.
مثل ذلك:
$query = sprintf('UPDATE `%s` SET `stock` = :amount WHERE `itemname` = \'$q\'', $tablename);
أو
$query = sprintf("UPDATE `%s` SET `stock` = :amount WHERE `itemname` = \'$q\'", $tablename);
لا يمكنك تكوينك '
في الأوتار المحددة بواسطة '
. إما دون تكوين "
في الأوتار المحددة بواسطة "
. للهروب من محدد السلسلة ، تحتاج إلى إعداد أ \
حرف.