$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');
Вы определяете строку, используя одинарные кавычки, и PHP не анализирует строки с разделителями одиночной кавычки. Чтобы получить переменную интерполяцию, вам нужно использовать двойные кавычки или конкатенацию строк (или их комбинацию). См. http://php.net/manual/en/language.types.string.php для получения дополнительной информации.
Также вы должны проверить, что mysql_query вернул действительный ресурс результата, иначе fetch_ *, num_rows и т. д. не будут работать с результатом, поскольку это не результат! IE:
$username = $_POST['username']; $password = $_POST['password']; $result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username'); if( $result === FALSE ) { trigger_error('Query failed returning error: '. mysql_error(),E_USER_ERROR); } else { while( $row = mysql_fetch_array($result) ) { echo $row['username']; } }
http://us.php.net/manual/en/function.mysql-query.php для получения дополнительной информации.
Присвоения, как и в var=foo*
, не расширяют globs - то есть, когда вы запускаете var=foo*
, буквальная строка foo*
помещается в переменная foo
, а не список файлов, соответствующих foo*
.
Напротив, некорректное использование foo*
в командной строке расширяет глобус, заменяя его списком отдельных имен, , каждый из которых передается как отдельный аргумент .
Таким образом, запуск ./yourscript foo*
не проходит foo*
как $1
, если нет файлов, соответствующих этому выражению glob; вместо этого он становится чем-то вроде ./yourscript foo01 foo02 foo03
, причем каждый аргумент находится в другом месте в командной строке.
Причина, по которой работает ./yourscript "foo*"
, является обходным путем - это неупомянутое расширение внутри скрипта, позволяющее glob в дальнейшем. Однако это плохая практика: расширение glob происходит параллельно с расщеплением строк (это означает, что использование этого поведения устраняет вашу способность передавать имена файлов, содержащие символы, найденные в IFS
, обычно пробелы), а также означает, что вы не можете передавать литералы имена файлов, когда они также могут быть интерпретированы как глобы (если у вас есть файл с именем [1]
и файл с именем 1
, передача [1]
всегда будет заменена на 1
).
Идиоматический способ построения этого будет состоять в том, чтобы shift
отпустить первый аргумент, а затем перебрать последующие, например:
#!/bin/bash
out_base=$1; shift
shopt -s nullglob # avoid generating an error if a directory has no .status
for dir; do # iterate over directories passed in $2, $3, etc
for file in "$dir"/*.status; do # iterate over files ending in .status within those
grep -e "string" "$file" # match a single file
done
done >"${out_base}.extension"
Если у вас много файлов .status
в одном каталоге, все это можно сделать более эффективным, используя find
для вызова grep
с максимально возможным количеством аргументов, а не для вызова grep
отдельно для каждого файла :
#!/bin/bash
out_base=$1; shift
find "$@" -maxdepth 1 -type f -name '*.status' \
-exec grep -h -- /dev/null '{}' + \
>"${out_base}.extension"
Оба сценария выше предполагают, что глобы не передавались в вызывающую оболочку. Таким образом, использование имеет форму:
# being unquoted, this expands the glob into a series of separate arguments
your_script descriptor dir_*_map
Это значительно лучше, чем передача globs в ваш скрипт (который затем должен расширять их для получения фактических файлов для использования); он корректно работает с именами, содержащими пробелы (которые другая практика не делает), и файлы, имена которых сами являются глобус-выражениями.
Некоторые другие примечания:
"$dir"/*.status
, то завершите кавычки до начала выражения glob. for dir; do
точно эквивалентен for dir in "$@"; do
, который итерации по аргументам. Не делайте ошибку, используя вместо этого for dir in $*; do
или for dir in $@; do
! Эти последние вызовы объединяют каждый элемент списка с первым символом IFS
(который по умолчанию содержит пространство, вкладку и новую строку в этом порядке), затем разбивает результирующую строку на любые IFS
символы, найденные внутри , затем расширяет каждый компонент результирующего списка в виде глоба. /dev/null
в качестве аргумента в grep
является мерой безопасности: она гарантирует, что у вас нет другого поведения между одно- аргумент и аргументы с несколькими аргументами (в качестве примера, grep
по умолчанию используется для печати имен файлов в выходном файле только при передаче нескольких аргументов) и гарантирует, что вы не можете grep
зависать, пытаясь читать из stdin, если он не передал никаких дополнительных имен файлов (f36] здесь не будет, но xargs
может).