كيف يمكنني إنشاء بيان PDO معلمات في PHP لاستعلام ديناميكي؟

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

  •  06-09-2019
  •  | 
  •  

سؤال

الاعتذار إذا طلب هذا بالفعل. لقد رأيت إجابات بخصوص SQLs الثابتة، ولكن في هذه الحالة أود استخدام PDO-> الاستعداد () للحصول على سلسلة استعلام مبنية ديناميكيا في وقت التشغيل.

الانهيار إلى مثال بسيط:

$TempSQL = "SELECT field1, field2, field3 FROM table WHERE ";

if ($numberParams == 1) {
    $TempSQL = $TempSQL . " field1 = '$val1' ";
} else {
    $TempSQL = $TempSQL . " field2 = '$val2' ";
    $TempSQL = $TempSQL . " AND field3 = '$val3' ";
}

db->query($TempSQL);

كيف يمكنني إعادة كتابة هذا باعتباره DB-> الاستعداد ()؟

يجب أن أقوم ببناء البيان-> تنفيذ (الصفيف (': param' => $ var))) على الطاير كذلك؟

هل هناك طريقة أفضل / نيتر؟

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

المحلول

ربما شيء مثل هذا. (غير مجر

$TempSQL = "SELECT field1, field2, field3 FROM table WHERE ";
$args=array();

if ($numberParams == 1) {
    $TempSQL = $TempSQL . " field1 = :val1"
    $args[':val1']=$val1;
} else {
    $TempSQL = $TempSQL . " field2 = :val2 and field3 = :val3";
    $args[':val2']=$val2;
    $args[':val3']=$val3;
}

$stmt=$db->prepare($TempSQL);
$stmt->execute($args);

نصائح أخرى

بناء على مثالك، ستكون طريقة Neater حلقة بدلا من التبديل.

يسمح لك DB-> الاستعداد () استبدال الأنماط (على php.net، فإن المثال يضع القولون أمام اسم الحقل) باستخدام BindParam () أو صفيف على pdostatement-> exec (). وبعد يمكنك استعمال ال ب من الأمثلة 3 و 4 بدلا من تسمية القيم الحقلية.

لا يزال يتطلب أن تكون جميع الحقول معروفة ببيان SQL.

$TempSQL = 'SELECT field1, field2, field3 FROM table';
$cond = array();
$params = array();
if (!empty($val1)) {
    $cond[] = "field1 = ?";
    $params[] = $val1;
}
if (!empty($val2)) {
    $cond[] = "field2 = ?";
    $params[] = $val2;
}
if (!empty($val3)) {
    $cond[] = "field3 = ?";
    $params[] = $val3;
}
if (count($cond)) {
    $TempSQL .= ' WHERE ' . implode(' AND ', $cond);
}
$stmt = $pdo->prepare($TempSQL);
$stmt->execute($params);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top