Потерпи меня секунду, потому что это не обычный тип "О, да, я набрал название базы данных".
У меня есть приложение 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 игнорировать все, что говорит клиент, и открывать только ту базу данных, которой я говорю? Бонусные баллы, если вы можете понять, как все это началось.