سؤال

وأواجه مشاكل تنفيذ بيان معد سلفا عبر mysqli.

أولا أنا كان الحصول على القيادة من أخطاء المزامنة. أنا تخزين النتيجة وإغلاق الصدد، ولقد توقفت عن الحصول على هذا الخطأ، لذلك نأمل توقف المشكلة.

ومع ذلك، فإن الخطأ في بلدي خطأ في بناء الجملة مزود، التي كانت تعمل بشكل جيد في حين كانت الأوامر غير متزامنة، قد عادت إلى الظهور. هنا هو رمز بلادي الحالي:

ولقد حاولت العديد من الطرق المختلفة لتصحيح هذا الخطأ snytax، من طريق CONCAT، التي علق بها لأنها فشلت، من تعيين٪ الإشارات إلى متغير قبل ربط أعمال etc..nothing.

ومحاولة استخدام:

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

والنتائج في خطأ لتمرير حسب المرجع.

<?php
$con = mysqli_connect("localhost", "blah", "blah", "blah");
if (!$con) {
    echo "Can't connect to MySQL Server. Errorcode: %s\n". mysqli_connect_error();
    exit;
}
$con->query("SET NAMES 'utf8'");
$brand = "o";
$brand = "% ".$brand." %";
echo "\n".$brand;
$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS WHERE upper(ARTICLE_NAME) LIKE ?";
//CONCAT('%', ?, '%')";
echo "\ntest";
if ($numRecords = $con->prepare($countQuery)) {
    $numRecords->bind_param("s",  $brand);
    echo "\ntest bind";
    $numRecords->execute();
    echo "\ntest exec";
    $numRecords->store_result();
    $data = $con->query($countQuery) or die(print_r($con->error));
    $rowcount = $data->num_rows;
    $numRecords->free_result();
    $numRecords->close();
    echo "/ntest before rows";
    $rows = getRowsByArticleSearch("test", "Auctions", " ");
    $last = ceil($rowcount/$page_rows);
} else {
    print_r($con->error);
}
foreach ($rows as $row) {
    $pk = $row['ARTICLE_NO'];
    echo '<tr>' . "\n";
    echo '<td><a href="#" onclick="updateByPk(\'Layer2\', \'' . $pk . '\')">'.$row['USERNAME'].'</a></td>' . "\n";
    echo '<td><a href="#" onclick="updateByPk(\'Layer2\', \'' . $pk . '\')">'.$row['shortDate'].'</a></td>' . "\n";
    echo '<td><a href="#" onclick="deleterec(\'Layer2\', \'' . $pk . '\')">DELETE RECORD</a></td>' . "\n";
    echo '</tr>' . "\n";
}
function getRowsByArticleSearch($searchString, $table, $max) {
    $con = mysqli_connect("localhost", "blah", "blah", "blah");
    //global $con;
    $recordsQuery = "SELECT ARTICLE_NO, USERNAME, ACCESSSTARTS, ARTICLE_NAME, date_format(str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s'), '%d %m %Y' ) AS shortDate FROM $table WHERE upper(ARTICLE_NAME) LIKE '%?%' ORDER BY str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s')" . $max;
    if ($getRecords = $con->prepare($recordsQuery)) {
        $getRecords->bind_param("s", $searchString);
        $getRecords->execute();
        $getRecords->bind_result($ARTICLE_NO, $USERNAME, $ACCESSSTARTS, $ARTICLE_NAME, $shortDate);
        while ($getRecords->fetch()) {
            $result = $con->query($recordsQuery);
            $rows = array();
            while($row = $result->fetch_assoc()) {
                $rows[] = $row;
            }
            return $rows;
        }
    }
}

والخطأ المحدد هو:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 11

خط 11 هو خط تحديد $ countQuery.

وكما ترون، وassined العلامة التجارية باسم "س"؛

وهكذا ينبغي أن يكون بيان SQL

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

والذي يعمل بشكل جيد عند وضعه في يدويا.

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

المحلول

mysqli_stmt::bind_param يمكن ربط فقط متغير معين، وليس تعبيرا. يتم تمرير متغير الموردة إلى 'ربط' بالرجوع، وليس من حيث القيمة، وهذا يعني أن SQL الأساسي يحصل مهما كانت قيمة هذا المتغير لديها في الوقت يتم تنفيذ الأمر، وليس عندما يكون من المحتم.

استخدم:

WHERE field LIKE CONCAT('%', ?, '%")

وأو القيام به:

$brand = '%' . $brand . '%'

وعلى الفور قبل أن يتم تنفيذ الأمر.

ما لا يمكنك فعله هو:

WHERE field LIKE '%?%

ولأن المتغير ? ملزمة يجب أن تتوافق مع سلسلة واحدة أو قيمة رقمية، وليس لفرعية (أو اسم الحقل).

تعديل في هذه الحالة، تظهر المشكلة الحقيقية ليتم الخلط بين البيانات المعدة (وهو ما يؤيده <لأ href = "http://php.net/mysqli.prepare" يختلط = "نوفولو noreferrer "> mysqli::prepare و mysqli_stmt::execute() ) مع الاستعلامات سهل القديمة (كما فعلت مع <أ href ل = "http://php.net/mysqli.query" يختلط = "نوفولو noreferrer"> mysqli::query() ). يجب عليك أن تسأل أيضا فقط لعدد الصفوف مباشرة من خادم DB، بدلا من سحب البيانات واستخدام NUM_ROWS:

$countQuery = "SELECT COUNT(ARTICLE_NO) FROM AUCTIONS WHERE upper(ARTICLE_NAME) LIKE ?";
if ($numRecords = $con->prepare($countQuery)) {
    $numRecords->bind_param("s",  $brand);
    $numRecords->execute();
    $numRecords->bind_result($num_rows);
    $numRecords->fetch();
    $numRecords->free_result();
    $numRecords->close();
    $last = ceil($rowcount/$page_rows);
} else {
    print_r($con->error);
}

نصائح أخرى

والمشكلة ليست في بيان معد سلفا، ولكن في استدعاء الأسلوب 'استعلام' لا ينبغي أن يكون هناك - كما يتم استخدامه لتنفيذ "المعيار" (لم يكن مستعدا) البيانات

$data = $con->query($countQuery) or die(print_r($con->error));
$rowcount = $data->num_rows;

يجب أن يكون

$rowcount = $numRecords->num_rows;

وفي وظيفة getRowsByArticleSearch، يجب عليك مرة أخرى إسقاط الاستعلام واستخدام المتغيرات التي تم تمريرها إلى bind_result للإخراج:

  $getRecords->bind_result($ARTICLE_NO, $USERNAME, $ACCESSSTARTS, $ARTICLE_NAME, $shortDate);
  while ($getRecords->fetch()) {
    $pk = $ARTICLE_NO;
    echo '<tr>' . "\n";
    echo '<td><a href="#" onclick="updateByPk(\'Layer2\', \'' . $pk . '\')">'.$USERNAME.'</a></td>' . "\n";
    // etc...
  }

وقليلا مزيد من المعلومات، راجع دليل PHP من bind_result: HTTP : //php.net/manual/en/mysqli-stmt.bind-result.php

وهذه الوظيفة على mysql.com يبدو تشير إلى أن CONCAT() ينبغي العمل: http://forums.mysql.com/read.php؟ 98،111039،111060 # جي اس-111060

هل حاولت استخدام بارامس اسمه؟

وحاول الاتصال على:

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

ولكن مزود الخاص بك هو:

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

لا ينبغي أن يكون؟ (لاحظ LIKE ?s)

$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS WHERE upper(ARTICLE_NAME) LIKE ?s";
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top