PHP PDO BINDVALUE () لا تعمل
سؤال
<?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
لكي تعتبر عددًا صحيحًا - وهو ما تريده ، هنا - ستحتاج إلى تحويله إلى عدد صحيح بنفسك.
من أجل القيام بذلك ، يمكنك استخدام:
يبدو مثل $ _get ['index'] ما تتوقعه. استخدم var_dump () لفحص القيمة أقرب. انتبه إلى طول السلسلة التي تقاريرها var_dump ، لأن بعض الأحرف غير قابلة للاكتشاف بصريًا ، ولكن طول السلسلة سوف يروي القصة المخفية.