Почему следующая команда SQL не будет работать с mysql_query в PHP? - PullRequest
2 голосов
/ 13 сентября 2011
SELECT       *
FROM         `enzymes`
  INNER JOIN `compounds`
  ON         compounds.compound_id = enzymes.compound_id
WHERE        `ec` LIKE '1.11%'

он работает в phpmyadmin и mysql workbench.

Он не будет работать независимо от того, использую ли я backtick все, используя mysql_real_escape_string и добавляю имя базы данных, где это необходимо.php-код phpmyadmin также не будет работать.

ОШИБКИ : Предупреждение : mysql_fetch_assoc () ожидает, что параметр 1 будет ресурсом, логическое значение задано в ....

та же ошибка для всех других функций, зависящих от ресурса запроса

Upd :

case 'ec':
    $dbl = mysql_connect(DB_ADDRESS, DB_USER, DB_PASSWORD);
    mysql_select_db("kegg", $dbl);
    //a)connection is fine
    //b)tried with explicitly providing the db name vs with pre-selection
    $sql = "SELECT * FROM enzymes INNER JOIN `compounds` ON compounds.compound_id=enzymes.compound_id";
    print_r($sql);
    $result = mysql_query( $sql, $dbl);
    print  mysql_error ($dbl);
    while ($row = mysql_fetch_assoc($result)) {
         print_r($row)
         $items[ $row['name'] ] = $row['compound_id'];          
    }

,,,

Решение : Спасибо всем, - первым дал решающий ответ Брэд.

$sql = "SELECT enzymes.*, compounds.*\n"
. "FROM enzymes\n"
. " INNER JOIN compounds\n"
. " ON compounds.compound_id = enzymes.compound_id\n"
. "WHERE enzymes.ec LIKE '1.11%' LIMIT 0, 30 ";

Подобная тема возникла недавно, когда предполагалось, что она работает только при выборе определенных полей.Важнейшее решение, когда требуются все данные, - это устранить неоднозначности:

enzymes.*, compounds.*

Ответы [ 5 ]

2 голосов
/ 13 сентября 2011

Учитывая эту ошибку, mysql_query возвращает логическое значение FALSE, указывающее на ошибку. Попробуйте это:

$result = mysql_query(...your query here...) or die(mysql_error());

, чтобы точно увидеть, в чем ошибка.

1 голос
/ 13 сентября 2011

Существует ряд причин, по которым запрос будет работать в таких средах, как phpMyAdmin, но не через функции PHP mysql.Для начала убедитесь, что вы выбрали правильную базу данных с помощью команды USE через PHP mysql_select_db function ( docs ).При использовании phpMyAdmin это выполняется в фоновом режиме автоматически, а не с помощью сценария PHP.

Если вы укажете имена баз данных в своем запросе, предыдущий шаг не потребуется, НО , ваш код будет намного сложнее поддерживать, если когда-либо произойдет изменение имени базы данных.

Чтобы указать таблицу, сделайте следующее: SELECT field1, field2 FROM database_name.table_name WHERE...

ВтороеЕсли вы используете двойные или одинарные кавычки неправильно, переменные могут не анализироваться или другие подобные проблемы: это приведет к тому, что ваш запрос будет недействительным.Пример кода поможет определить, так ли это.

1 голос
/ 13 сентября 2011

Моя интуиция говорит мне, что база данных перепутана ссылками на ваши столбцы. Когда вы начинаете создавать объединения, особенно если у вас есть имена столбцов, которые могут совпадать, рекомендуется четко указывать, что вы выбираете, сравнивать и т. Д., Например,

SELECT       enzymes.*
FROM         enzymes
  INNER JOIN compounds
  ON         compounds.compound_id = enzymes.compound_id
WHERE        counpounds.ec LIKE '1.11%'

Но, не зная точной ошибки, которая возникает, это может быть только предположение .

UPDATE

Теперь, когда я вижу ошибку, убедитесь, что вы проверяете правильность ответа на запрос. Когда вы звоните mysql_query (или как вы это используете), проверьте ресурс на наличие сбоев, прежде чем пытаться получить результат. В большинстве библиотек подключений есть метод * _error или * _last_error, который можно вызвать, чтобы узнать причину сбоя.

0 голосов
/ 13 сентября 2011

Избегайте неоднозначных ошибок столбцов в MySQL INNER JOIN.Пожалуйста, попробуйте:

SELECT       compounds.compound_id as cid, enzymes.compound_id as eid
FROM         `enzymes`
  INNER JOIN `compounds`
  ON         compounds.compound_id = enzymes.compound_id
WHERE        `enzymes`.`ec` LIKE '1.11%'

И если вы получите аналогичные пары идентификаторов, проблема здесь.

0 голосов
/ 13 сентября 2011

Это указывало на то, что вы должны передать ресурс MySQL в mysql_query.

посмотрите на:

resource mysql_query ( string $query [, resource $link_identifier ] )

При открытии соединения вы получите $ link_identifier:

$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
   die('Could not connect: ' . mysql_error());
}
...