Функция PHP MySQL max () производит 5 - PullRequest
0 голосов
/ 23 сентября 2011

Я работаю над опросом, созданным PHP и MySQL. Итак, проблема в том, что я пытаюсь создать ResponseID, который является идентификатором, специфичным для каждого человека, отправляющего опрос. Таким образом, код был создан для добавления 1 к существующему максимальному значению из столбца ResponseID. Вот код:

//Response ID creation 
$query = "SELECT max(ResponseID) FROM survey";
$res = mysql_query($query);
$RID = $res+1; 

Я знаю, что могу сжать его, но вот проблема: я уже внес один элемент в таблицу с ResponseID, равным 1. Когда я тестировал опрос с разными ответами, следующий ResponseID был 5. Это должно было быть 2. Поэтому я снова проверил, чтобы увидеть, получится ли 6 в следующий раз.

К сожалению, это снова произвело 5. Мой PHP-гуру просмотрел его, и он сказал, что кодировка верна и что-то должно быть из базы данных. Я не установил ничего в ResponseID, за исключением того, что это int. Так почему же он производит 5? Если кто-нибудь может сказать мне, как это исправить, это было бы очень круто с вашей стороны.

Я немного новичок в PHP.

Ответы [ 7 ]

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

$ res будет дескриптором оператора mysql, а НЕ результатом запроса. вам все еще нужно получить строку из этого результата $ res, чтобы получить доступ к значению функции max () в запросе.

Этот дескриптор, вероятно, внутренне имеет идентификатор # 5, поэтому вы получаете этот "странный" результат.

Код должен быть:

$sql = "SELECT MAX(responseID) AS max ...";
$result = mysql_query($sql) or die(mysql_error());
$row = mysql_fetch_assoc($result);

$RID = $row['max'] + 1;
1 голос
/ 23 сентября 2011

$ res - это ресурс, а не значение запроса, пожалуйста, прочтите руководство: http://nz.php.net/manual/en/function.mysql-query.php

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

Я не совсем уверен, понял ли я вашу проблему, но если вы хотите сгенерировать идентификатор ответа, специфичный для каждого пользователя или каждого опубликованного опроса, тогда вы можете использовать auto_increment для идентификатора ответа.идентификатор ответа будет увеличиваться каждый раз при публикации нового опроса.также получите последний опубликованный идентификатор, используя mysql_insert_id, чтобы получить последний опубликованный идентификатор.

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

$last_id = mysql_insert_id ();

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

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

Причина, по которой вы не получаете правильное значение, заключается в том, что mysql_query не возвращает значение, а возвращает ресурс.

Попробуйте вместо этого:

//Response ID creation 
$query = "SELECT max(ResponseID) FROM survey";
$res = mysql_query($query);
if($res !== FALSE) $res = mysql_fetch_array($res);   // If $res === FALSE, something went wrong
$RID = $res[0] + 1;

Также я предлагаюиспользовать AUTO_INCREMENT в поле ResponseID, это значительно облегчит вашу жизнь:)

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

Используйте $row = mysql_fetch_assoc($res) для получения результирующей строки из вашего запроса.

См. mysql_fetch_assoc () .

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

Для этого нужно использовать столбец AUTO_INCREMENT. Проблема в том, что если два экземпляра PHP-скрипта работают одновременно (что весьма вероятно при условии, что вы используете многопоточный сервер, такой как Apache), то вы можете иметь такой случай:

|PHP #1         |  PHP #2       |
=================================
|Accept client  |(waiting)      |
|SELECT MAX...  |(waiting)      |
|Send to MySQL  | Accept client |
|(waiting)      | SELECT MAX... |
|(waiting)      | Send to MySQL |
|Get response 4 |Get response 4 | //Nothing inserted yet, max is still 4
|Try to insert 5| (waiting)     |
|Succeeded      | (waiting)     |
|(waiting)      |Try to insert 5|
| ...           | Failed!       |

(Это в дополнение к тому, что сказал Дагон)

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

Почему бы вам не использовать столбец AUTO_INCREMENT и получить новое значение, используя mysql_insert_id?

...