الحصول على PDO سلسلة الاستعلام مع الالتزام المعلمات دون تنفيذ ذلك

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

  •  22-08-2019
  •  | 
  •  

سؤال

هل من الممكن الحصول على سلسلة الاستعلام من شركة تنمية نفط عمان كائن لا بد المعلمات دون تنفيذ ذلك أولا ؟ لدي التعليمات البرمجية مشابهة لما يلي (حيث $dbc هو شركة تنمية نفط عمان الكائن):

$query = 'SELECT * FROM users WHERE username = ?';
$result = $dbc->prepare($query);
$username = 'bob';
$result->bindParam(1, $username);
echo $result->queryString;

حاليا, هذا سوف صدى من SQL مثل:"SELECT * FROM users WHERE username = ?".ولكن أود أن يكون لا بد المعلمة شملت بحيث يبدو مثل:'SELECT * FROM users WHERE username = 'بوب'".هل هناك طريقة للقيام بذلك دون تنفيذ ذلك أو استبدال علامات استفهام مع المعلمات من خلال شيء مثل preg_replace?

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

المحلول

وباختصار: لا. انظر الحصول على سلسلة الاستعلام SQL الخام من شركة تنمية نفط عمان أعدت البيانات

إذا كنت تريد فقط محاكاته، في محاولة:

echo preg_replace('?', $username, $result->queryString);

نصائح أخرى

هذا هو عام الاختلاف من regexp تقنية, بالنسبة مرقمة مجموعة من المعلمات.

كان أكثر قليلا بجنون العظمة من قبول الإجابة لأن نقلا عن كل شيء, الأرقام المدرجة ، عض لي في المؤخرة أكثر من مرة واحدة ؛ في الخلية وكذلك في أماكن أخرى1, '123' هو أقل من '13'.الشيء نفسه ينطبق على 'NULL', الذي هو لا NULL, ، 'false', التي من الواضح صحيح.

وقد أشار لي أن كنت لا بجنون العظمة يكفي : -) ، ? استبدال تقنية ("#\\?#") كان من السذاجة, لأن المصدر الاستعلام قد تحتوي على علامات استفهام كما نص في الجسم لأي سبب من الأسباب:

$query = "SELECT CONCAT('Is ', @value, ' ', ?, '? ', 
       IF(@check != ? AND 123 > '13', 'Yes!', 'Uh, no?')) 
       ;

$values = array('correct', false, 123);

// Expecting valid SQL, selecting 'correct' if check is not false for 123
// and answering Yes if @check is true.

الإخراج:

SELECT CONCAT('Is ', @value, ' ', 'correct', '? ',
   IF(check != false AND 123 > '13', 'Yes!', 'Uh, no?')) 
   ;

Is THIS_TEST correct? Yes!

بلدي أبسط التنفيذ قد القيت استثناء رؤية الكثير من علامات الاستفهام.حتى أبسط التنفيذ قد عاد شيء مثل

Is THIS_TEST correcttrue Uh, no

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

function boundQuery($db, $query, $values) {
    $ret = preg_replace_callback(
        "#(\\?)(?=(?:[^']|['][^']*')*$)#ms",
        // Notice the &$values - here, we want to modify it.
        function($match) use ($db, &$values) {
            if (empty($values)) {
                throw new PDOException('not enough values for query');
            }
            $value  = array_shift($values);

            // Handle special cases: do not quote numbers, booleans, or NULL.
            if (is_null($value)) return 'NULL';
            if (true === $value) return 'true';
            if (false === $value) return 'false';
            if (is_numeric($value)) return $value;

            // Handle default case with $db charset
            return $db->quote($value);
        },
        $query
    );
    if (!empty($values)) {
        throw new PDOException('not enough placeholders for values');
    }
    return $ret;
}

يمكن للمرء أيضا تمديد PDOStatement من أجل توفير $stmt->boundString($values) الأسلوب.


(1) لأن هذا هو PHP, هل حاولت من أي وقت مضى $a = 1...1; print $a;?

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