SQL مثل فشل الاستعلام - خطأ فادح في بيان معد سلفا

StackOverflow https://stackoverflow.com/questions/601992

  •  03-07-2019
  •  | 
  •  

سؤال

ولدي البرمجية التالية:

$countQuery = "SELECT ARTICLE_NO FROM ? WHERE upper(ARTICLE_NAME) LIKE '% ? %'";
if ($numRecords = $con->prepare($countQuery)) {
    $numRecords->bind_param("ss", $table, $brand);
    $numRecords->execute();
    $data = $con->query($countQuery) or die(print_r($con->error));
    $rowcount = mysql_num_rows($data);
    $rows = getRowsByArticleSearch($query, $table, $max);
    $last = ceil($rowcount/$page_rows);
}

والتي يجب أن تعمل على ما يرام. ومع ذلك أتلقى الخطأ ما يلي:

لديك خطأ في تركيب SQL الخاص بك؛ دليل للتحقق من الذي يتوافق مع إصدار خادم MySQL الخاص لبناء الجملة الصحيح استخدام بالقرب من '؟ أين العليا (ARTICLE_NAME) LIKE '٪؟٪' 'في السطر 1

إذا وضعت

SELECT ARTICLE_NO FROM AUCTIONS WHERE upper(ARTICLE_NAME) LIKE '% o %';

والاستعلام يعمل بشكل جيد. يتم تعريف $ الجدول أعلاه، ويتم تلقي الاستعلام من GET، وكلاهما القيم الصالحة الصحيحة. لماذا هذا الفشل؟

وتحرير: تغيير إلى:

$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE '% ? %'";

if ($numRecords = $con->prepare($countQuery)) {

    $numRecords->bind_param("s", $query);

والنتائج في الخطأ:

تحذير: mysqli_stmt :: bind_param () [mysqli-stmt.bind-المعلمة]: عدد من المتغيرات لا يطابق عدد المعلمات في بيان معد سلفا في C: \ ملفات البرنامج \ إيزي بي إتش بي 3.0 \ شبكة الاتصالات العالمية \ بروغ \ get_records. فب على خط 38

وأوامر متزامنة. لا يمكنك تشغيل هذا الأمر الآن

وحيث أنه

$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE ?";

if ($numRecords = $con->prepare($countQuery)) {

    $numRecords->bind_param("s", "%".$query."%");

والنتائج في

خطأ فادح: لا يمكن تمرير المعلمة 2 بالرجوع في C: \ ملفات البرنامج \ إيزي بي إتش بي 3.0 \ شبكة الاتصالات العالمية \ بروغ \ get_records.php على خط 38

وأخيرا

$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE ? ";

if ($numRecords = $con->prepare($countQuery)) {

    $numRecords->bind_param("s", $query);

وسيعطي فقط:

وأوامر متزامنة. لا يمكنك تشغيل هذا الأمر الآن

هل من المستحيل استخدام المعلمتين لstatament تحب؟

هل كانت مفيدة؟

المحلول

لبند LIKE، استخدم هذا:

SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE CONCAT('%', ?, '%')

وأما بالنسبة للاسم الجدول، انها ممارسة سيئة للغاية أن يكون أسماء الجداول كمعلمات.

وإذا كان لسبب ما زالت هناك حاجة للقيام بذلك، وسوف تحتاج إلى تضمين ذلك في نص الاستعلام قبل إعداد الاستعلام:

$countQuery = "SELECT ARTICLE_NO FROM $table_name WHERE upper(ARTICLE_NAME) LIKE CONCAT('%', ? ,'%')";
if ($numRecords = $con->prepare($countQuery)) {
    $numRecords->bind_param("s", $brand);
    $numRecords->execute();
    $data = $con->query($countQuery) or die(print_r($con->error));
    $rowcount = mysql_num_rows($data);
    $rows = getRowsByArticleSearch($query, $table, $max);
    $last = ceil($rowcount/$page_rows);
}

نصائح أخرى

هل صدر

mysqli_free_result($result);

وبعد الاستعلام الماضي؟ وهذا الأمر من الخطأ المزامنة.

وهذا يجب أن تعمل ولكن

$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE ?";
if ($numRecords = $con->prepare($countQuery)) {
    $numRecords->bind_param("s", "%".$query."%");

ويتساءل ما هو موجود في المتغير $ الاستعلام. محاولة القيام بذلك بدلا

$query = '%'.$query.'%';
$numRecords->bind_param("s", $query);

وحاول القيام بما يلي بدلا من ذلك:

$countQuery = "SELECT ARTICLE_NO FROM ? WHERE upper(ARTICLE_NAME) LIKE ?";
if ($numRecords = $con->prepare($countQuery)) {
    $numRecords->bind_param("ss", $table, "%$brand%");
    $numRecords->execute();
    $data = $con->query($countQuery) or die(print_r($con->error));
    $rowcount = mysql_num_rows($data);
    $rows = getRowsByArticleSearch($query, $table, $max);
    $last = ceil($rowcount/$page_rows);
}

وAFAIK لا يمكنك استخدام العناصر النائبة عن معرفات مع mysqli وإعداد البيانات. لذلك عليك أن أقحم TABLENAME يدويا في الاستعلام.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top