Динамический var потерян внутри для [duplicate]

Как объяснил scompt.com , запрос может завершиться ошибкой. Используйте этот код, чтобы получить ошибку запроса или правильный результат:

$username = $_POST['username'];
$password = $_POST['password'];

$result = mysql_query("
SELECT * FROM Users 
WHERE UserName LIKE '".mysql_real_escape_string($username)."'
");

if($result)
{
    while($row = mysql_fetch_array($result))
    {
        echo $row['FirstName'];
    }
} else {
    echo 'Invalid query: ' . mysql_error() . "\n";
    echo 'Whole query: ' . $query; 
}

Для получения дополнительной информации см. Документацию для mysql_query() .

Фактической ошибкой были одиночные кавычки, так что переменная $username не анализировалась. Но вы действительно должны использовать mysql_real_escape_string($username), чтобы избежать инъекций SQL.

4
задан David Vail 3 November 2015 в 14:23
поделиться

3 ответа

Это вызвано ленивностью - map возвращает ленивую последовательность, которая определена внутри привязки, но оценивается снаружи. Вам необходимо принудительно выполнить оценку изнутри:

(binding [*out-dir* "/home/dave"] 
  (doall (map #(str *out-dir* %) [1 2 3])))
5
ответ дан Lee 1 September 2018 в 09:20
поделиться

Другое решение - использовать функции генератора в стиле Python, доступные через lazy-gen и yield из библиотеки Tupelo :

(ns tst.demo.core
  (:use demo.core tupelo.test)
  (:require
    [tupelo.core :as t] ))
(t/refer-tupelo)

(def ^:dynamic foo 1)

(dotest
  (let [result (binding [foo 3]
                 (lazy-gen
                   (doseq [x (range 3)]
                     (yield {:foo foo :x x})))) ]
    (println result)))

result => ({:foo 3, :x 0} 
           {:foo 3, :x 1}
           {:foo 3, :x 2})
0
ответ дан Alan Thompson 1 September 2018 в 09:20
поделиться

Это правда, что лени и динамические привязки могут вызвать проблемы; однако отказ от лени - не единственное решение. Если вы хотите сохранить лень (или использовать динамические привязки с pmap), используйте bound-fn или bound-fn* .

(def ^:dynamic x 0)

=> (binding [x 3] (map #(+ x %) (range 10)))
;; (0 1 2 3 4 5 6 7 8 9)

=> (binding [x 3] (map (bound-fn [y] (+ x y)) (range 10)))
;; (3 4 5 6 7 8 9 10 11 12)

=> (binding [x 3] (map (bound-fn* #(+ % x)) (range 10)))
;; (3 4 5 6 7 8 9 10 11 12)
2
ответ дан galdre 1 September 2018 в 09:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: