PHP Switch-оператор, использующий результат MySQL Query - PullRequest
1 голос
/ 20 августа 2011

Чтобы сделать мою жизнь немного проще, я создал функцию DoQuery:

// DoQuery
function DoQuery($sql)
{
    global $cm_db_host,$cm_db_user,$cm_db_pass,$cm_db_name;
    $con = mysql_connect($cm_db_host,$cm_db_user,$cm_db_pass);
    if(!$con) return 1001;
    $db = mysql_select_db($cm_db_name);
    if(!$db) return 1002;
    $res = mysql_query($sql);
    if(!$res) return 1003;
    return $res;
    mysql_close();
}

Функция работает отлично - кажется ..

Вот как я ее использую:

 $res = DoQuery("UPDATE table SET column1='value 1',column2='value 2' WHERE id=1;");

 switch($res){
    case true:
      echo 'Response[success]ENDCMTAG';
      break;
    case 1001:
      die('Response[dberror1001]ENDCMTAG\r\n'.
      'MySQLError['.mysql_error().']ENDCMTAG\r\n');
      break;
    case 1002:
      die('Response[dberror1002]ENDCMTAG\r\n'.
      'MySQLError['.mysql_error().']ENDCMTAG\r\n');
      break;
    case 1003:
      die('Response[dberror1003]ENDCMTAG\r\n'.
      'MySQLError['.mysql_error().']ENDCMTAG\r\n');
      break;  
 } 

Теперь, когда я намеренно испортил оператор SQL, поэтому следует использовать case 1003, case true - это то, что выполняется.

Согласно руководству по PHP (да,Я действительно искал это;;)) ВСТАВКА MySQL, ОБНОВЛЕНИЕ .... или возвратит истину или ложь.В моей функции DoQuery всякий раз, когда функция MySQL возвращает false, вместо этого я выводил конкретные коды ошибок, поэтому я знаю, где она пошла не так.Если ошибки не возникает, $res должно быть истинным, а затем должно выполняться case true, верно?

Проблема в том, что он всегда выводит true, даже если я изменяю SQL-запрос на мусор.1017 *

Если я поставлю case true внизу переключателя, case 1001 всегда выполняется , когда все идет хорошо - я знаю, потому что я проверяю поле mysql_error() и егопусто.

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 20 августа 2011

Операторы Switch всегда выполняют произвольное сравнение.

Таким образом, любое число (кроме 0) также оценивается как True.

Еще одно улучшение, которое я бы сделал в вашем коде, - это использование констант для кодов ошибок.

define('QUERY_RESULT_SUCCESS', '1000');
define('QUERY_RESULT_CONNECTION_FAILED', '1001');
define('QUERY_RESULT_SELECTDB_FAILED', '1002');
define('QUERY_RESULT_QUERY_FAILED', '1003');

function DoQuery($sql)
{
    global $cm_db_host,$cm_db_user,$cm_db_pass,$cm_db_name;
    $con = mysql_connect($cm_db_host,$cm_db_user,$cm_db_pass);
    if(!$con) return QUERY_RESULT_CONNECTION_FAILED;
    $db = mysql_select_db($cm_db_name);
    if(!$db) return QUERY_RESULT_SELECTDB_FAILED;
    $res = mysql_query($sql);
    if(!$res) return QUERY_RESULT_QUERY_FAILED;
    return QUERY_RESULT_SUCCESS;
    mysql_close();
}

 $res = DoQuery("UPDATE table SET column1='value 1',column2='value 2' WHERE id=1;");

 switch($res){
    case QUERY_RESULT_SUCCESS:
      echo 'Response['.QUERY_RESULT_SUCCESS.']ENDCMTAG';
      break;
    case QUERY_RESULT_CONNECTION_FAILED:
      die('Response['.QUERY_RESULT_CONNECTION_FAILED.']ENDCMTAG'."\r\n".
      'MySQLError['.mysql_error().']ENDCMTAG\r\n');
      break;
    case QUERY_RESULT_SELECTDB_FAILED:
      die('Response['.QUERY_RESULT_SELECTDB_FAILED.']ENDCMTAG'."\r\n".
      'MySQLError['.mysql_error().']ENDCMTAG\r\n');
      break;
    case QUERY_RESULT_QUERY_FAILED:
      die('Response['.QUERY_RESULT_QUERY_FAILED.']ENDCMTAG'."\r\n".
      'MySQLError['.mysql_error().']ENDCMTAG\r\n');
      break;  
 } 

Также обратите внимание на двойные кавычки вокруг \r\n, так как он должен быть оценен.

1 голос
/ 20 августа 2011

Вы возвращаете значение 1003, которое оценивается как "истинное" значение по сравнению с логическим значением.Значение всегда будет TRUE.

// Essentially it is this:
if (1003) {
   // I'm TRUE!!!
}

. Вы также не можете использовать строгое сравнение ===, поскольку в истинном случае вы возвращаете ресурс результата MySQL, а не логическое значение TRUE.

Если вы переставите switch() так, чтобы действительный регистр ресурсов находился внизу, ваши ошибки будут сначала правильно оценены.

 switch($res){
    case 1001:
      die('Response[dberror1001]ENDCMTAG\r\n'.
      'MySQLError['.mysql_error().']ENDCMTAG\r\n');
      break;
    case 1002:
      die('Response[dberror1002]ENDCMTAG\r\n'.
      'MySQLError['.mysql_error().']ENDCMTAG\r\n');
      break;
    case 1003:
      die('Response[dberror1003]ENDCMTAG\r\n'.
      'MySQLError['.mysql_error().']ENDCMTAG\r\n');
      break;  

    // Valid result is the default case.
    default:
      echo 'Response[success]ENDCMTAG';
      break;
 }

Однако это немного странно иможет вызвать проблемы, если ваша функция когда-либо возвратит другое значение ошибки (если оно изменено), но переключатель не обновлен.Вместо этого вы должны сначала проверить значение true / false, а затем передать его коммутатору для оценки кодов ошибок:

// Check if we have an Integer value. If we do, its an error code!
// If not, it's a result, or true!
if (is_int($res)) {
 switch($res){
    case 1001:
      die('Response[dberror1001]ENDCMTAG\r\n'.
      'MySQLError['.mysql_error().']ENDCMTAG\r\n');
      break;
    case 1002:
      die('Response[dberror1002]ENDCMTAG\r\n'.
      'MySQLError['.mysql_error().']ENDCMTAG\r\n');
      break;
    case 1003:
      die('Response[dberror1003]ENDCMTAG\r\n'.
      'MySQLError['.mysql_error().']ENDCMTAG\r\n');
      break;  
 }
 // $res was valid. Success!
 else {
   // handle your valid results
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...