Необычно: Получение SQLSTATE [HY000] [1049] Неизвестная база данных от MariaDB, но для неверной базы данных - PullRequest
0 голосов
/ 04 февраля 2020

Потерпи меня секунду, потому что это не обычный тип "О, да, я набрал название базы данных".

У меня есть приложение PHP, которое работает в течение ГОДОВ и Perl программа командной строки, которая отправляет обновления в базу данных. Все это работало целую вечность. Теперь часть командной строки дает мне «SQLSTATE [HY000] [1049] Неизвестная база данных« siv3 »», что очень интересно, потому что «siv3» - это другая база данных на другом сервере, которая не имеет ничего общего с этим приложением ! Это похоже на то, что база данных запрашивается клиентом (она равна в файле .my.cnf, но удаление этого файла не решает проблему) и перезаписывает то, что находится в PHP. Я пытался удалить .my.cnf на клиенте, это не помогает. Я попробовал другой клиент, у которого нет .my.cnf, и это не помогает. Я искал на сервере веб-приложений файл .my.cnf или имя 'siv3' в любом месте и получил пустое значение.

Вот код клиента (сокращенный):

$user = `whoami` unless $user;
chomp($user);
if ($user eq 'root')
{ my $whoami = `who am i`;
  if ($whoami =~ /^(\w+)/)
  { $user = $1;
  }
  else
  { print "\nError: Unable to identify the logged-in user\n";
    exit 1;
  }
}
$data{'user'} = $user;

if ($timestamp)
{ $data{eventdate} = UnixDate(ParseDateString($timestamp),"%Y-%m-%d %T");
}
else
{ $timestamp = `date +'%F %T'`;
  chomp $timestamp;
  $data{eventdate} = $timestamp;
}

unless ($message)
{ print "\nError:  No log message provided \n";
  exit 1;
}
$data{message} = $message;
$data{action} = 'log';

if ($TESTMODE)
{ print "Hostname(s): $data{hostname}\n";
  print "You are $data{user}\n";
  print "Event date will be logged as $data{eventdate}\n";
  print "Message is: $data{message}\n";
}

# Convert %data to JSON
my $JSON = encode_json \%data;
print "JSON: $JSON\n" if $TESTMODE;

# And submit it to the log server
my $curl_cmd = sprintf($curl_template,$JSON,$maintlog_url);
print "Executing: $curl_cmd\n" if $TESTMODE;
my $response = `$curl_cmd`;
$response =~ s/Array\n//;
print "Response: $response\n" if $TESTMODE;

my $result = decode_json($response);

#my $result = $response;
#print "\n" . Dumper($result->{message}) . "\n\n";


foreach my $msg (@{$result->{message}})
{ print "$msg\n";
}

if ($result->{status} ne 'success')
{ exit 1;
}

exit 0;

Все, что он делает, это создает JSON пакет и отправляет его на сервер. Вот некоторый код с сервера:

function openDB($mode='read')
{
  # Detect whether we are in production or dev
  $PRODUCTION = ($_SERVER['SERVER_NAME'] != 'server name redacted');

  if ($PRODUCTION)
  {   $DSN = "mysql:host=redacted.example.com;dbname=maintlog";
  }
  else
  { $DSN =  "mysql:host=redacted-dev.example.com;dbname=maintlog";
  }

  switch ($mode)
  { case 'write':
    case 'create':
      $user = '';
      $pwd = '';
      break;
    case 'read':
    default:
      $user = '';
      $pwd = '';
      break;
  }

  $options = array (
       # SSL certificates redacted
       PDO::ATTR_PERSISTENT => true,
       PDO::MYSQL_ATTR_READ_DEFAULT_FILE => '/dev/null',
       );

 try {
   $dbh = new PDO($DSN,$user,$pwd,$options);
   $dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
 }
  catch (PDOException $e)
  { print "<p>Database error! (" . $e->getMessage() . ")</p>";
   die();
  }


  return $dbh;
}

Он умирает в этой функции. Типичный вывод выглядит следующим образом:

$ mlog -s SEKER -m "Testing..." -t
Hostname(s): SEKER
You are mraugh 
Event date will be logged as 2020-02-04 11:07:56
Message is: Testing... 
JSON: {"eventdate":"2020-02-04 11:07:56","action":"log","user":"mraugh","hostname":"SEKER","message":"Testing..."}
Executing: curl -s -k -H 'Content-type: application/json' -X POST -d
'{"eventdate":"2020-02-04 11:07:56","action":"log","user":"mraugh","hostname":"SEKER","message":"Testing..."}'
https://redacted.example.com/maintlog/api/log.php 
Response:
<p>Database error! (SQLSTATE[HY000] [1049] Unknown database 'siv3')</p> malformed JSON string, neither array, object, number, string or atom, at character offset 0 (before "<p>Database error! (...") at /usr/local/bin/mlog line 95.

Откуда взялся siv3 и как мне от него избавиться? Или, в противном случае, как мне сказать PHP игнорировать все, что говорит клиент, и открывать только ту базу данных, которой я говорю? Бонусные баллы, если вы можете понять, как все это началось.

...