سؤال

<?php
try
{
    $db = new PDO("mysql:host=localhost;dbname=DBNAME", "USER", "PASSWD");

    $stmt = $db->prepare("SELECT id, name FROM testdb ORDER BY time DESC LIMIT :index, 10");
    $stmt->bindValue(":index", $_GET['index'], PDO::PARAM_INT);
    $stmt->execute();

    while( $r = $stmt->fetch(PDO::FETCH_ASSOC) )
    {
        echo var_dump($r);                                      
    }

}
catch( PDOException $e )
{
    die("Exception");
}

المشكلة على هذا الخط: $stmt->bindValue(":index", $_GET['index'], PDO::PARAM_INT);

والمعلمة المحددة هي الثانية.

الرمز كما هو أعلاه لا يعمل ، فهو لا يعيد أي شيء حتى لا يتم تنفيذ حلقة. إذا استبدلت $ _get ['index'] برقم ، مثل 10 ، فإنه يعمل بشكل جيد ، فإنه يعيد 10 صفوف. يعرض صدى $ _get ['index'] رقمًا ، لذلك يجب أن يمرر رقمًا. لقد جربت أيضًا Bindparam ، لكن النتيجة هي نفسها.

لماذا لا يعمل هذا؟

تعديل:

مثيرة للاهتمام ... إذا استبدلت $_GET['index'] with (int)$_GET['index'] إنها تعمل.

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

المحلول

إذا قمت بالتحقق من $ STMT-> errorInfo () ، فستجد بالفعل أن استعلامك فشل.

يخبر PDO :: param_int PDO أنك تعطيه عددًا صحيحًا. إذا لم تعطي PDO عددًا صحيحًا ، فسيقتبس PDO القيمة في سلسلة SQL.

SELECT id, name FROM testdb ORDER BY time DESC LIMIT "1", 10

جميع القيم في $ _get هي إما صفيف أو سلسلة. لقد فعلت الشيء الصحيح عن طريق إكراه $ _get ['index'] على عدد صحيح قبل ربطه كقيمة. من خلال القيام بذلك ، يحصل PDO على عدد صحيح ، وكان يتوقع عددًا صحيحًا من PDO :: param_int ، وبالتالي لن يقتبس القيمة في سلسلة SQL.

SELECT id, name FROM testdb ORDER BY time DESC LIMIT 1, 10

نصائح أخرى

القيم في $_GET مجموعة Super-Global هي سلاسل: لا تخمن PHP ما الذي تم تمريره في Querystring.


إذا كنت تريد قيمة واحدة من $_GET لكي تعتبر عددًا صحيحًا - وهو ما تريده ، هنا - ستحتاج إلى تحويله إلى عدد صحيح بنفسك.

من أجل القيام بذلك ، يمكنك استخدام:

  • أ typecast : (int)$_GET['yourval']
  • ال intval() الوظيفة ، التي تسمح للمرء بخصم القاعدة التي سيتم استخدامها

يبدو مثل $ _get ['index'] ما تتوقعه. استخدم var_dump () لفحص القيمة أقرب. انتبه إلى طول السلسلة التي تقاريرها var_dump ، لأن بعض الأحرف غير قابلة للاكتشاف بصريًا ، ولكن طول السلسلة سوف يروي القصة المخفية.

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