class Program
{
static void Main(string[] args)
{
string link = @"D:\csharp_server\program\program\bin\Debug\net5.0\includes\php\win86\php-cgi.exe", //ссылка на CGI
text = @"D:\csharp_server\program\program\bin\Debug\net5.0\www\UPPDD\php\auth.php"; // ссылка на файл где идет использование POST/GET
Console.WriteLine(UseInterpreter(link, text));// вывод в консоль для просмотра
Console.ReadKey();
}
static string UseInterpreter(string php, string file)
{
ProcessStartInfo info = new ProcessStartInfo(php);
string req = "login=admin&pass=secretpass&but=%D0%92%D0%BE%D0%B9%D1%82%D0%B8"; // параметры формы
info.UseShellExecute = false;
info.ErrorDialog = false;
info.RedirectStandardError = true;
info.RedirectStandardInput = true;
info.RedirectStandardOutput = true;
info.CreateNoWindow = true;
// переменные среды
info.EnvironmentVariables.Add("REQUEST_METHOD", "POST");
info.EnvironmentVariables.Add("HTTP_CONNECTION", $"keep-alive");
info.EnvironmentVariables.Add("REDIRECT_STATUS", "false");
info.EnvironmentVariables.Add("GETAWAY_INTERFACE", "CGI");
info.EnvironmentVariables.Add("CONTENT_TYPE", "application/x-www-form-urlencoded");
info.EnvironmentVariables.Add("CONTENT_LENGTH", Encoding.UTF8.GetBytes(req).Length.ToString());
info.EnvironmentVariables.Add("HTTP_ACCEPT", "*.*");
info.EnvironmentVariables.Add("SCRIPT_FILENAME", file);
// передеча информации в Process и старт процесса
Process p = new Process();
p.StartInfo = info;
bool pStarted = p.Start();
StreamWriter input = p.StandardInput; // стандартынй поток ввода
input.WriteLine(req); // ввод
StreamReader output = p.StandardOutput; // поток вывода
StreamReader error = p.StandardError; // поток вывода ошибки
// перекодировка, при наличии кириллицы php выводит в кодировке cp866, тут мы переводим из cp866 в utf8
byte[] cp866_byte = output.CurrentEncoding.GetBytes(output.ReadToEnd());
string cp866_byte_to_utf8 = Encoding.UTF8.GetString(cp866_byte);
return cp866_byte_to_utf8;
}
}
$host = '127.0.0.1';
$db = 'test';
$user = 'root';
$pass = '';
$charset = 'utf8';
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$opt = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
$pdo = new PDO($dsn, $user, $pass, $opt)
$stmt = $pdo->prepare("SELECT last_name FROM first_table WHERE name=?");
$stmt->execute([$name]);
$last_name = $stmt->fetchColumn();
hello.html.twig
:Привет, {{ name }}!
,echo $twig->render('hello.html.twig', ['name' => 'Хабр']);
передаются имя темплейта и данные, которые там нужно подставить.REMOTE_ADDR
не подделать, но то в теории, потому что всякая кака на твоей стороне любит его подменять для удобства. Например нередко можно встретить глубоко в чужом коде подобную дыру:if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$xffaddrs = explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']);
$_SERVER['REMOTE_ADDR'] = $xffaddrs[0];
}
Мне почему-то кажется, что 'поиск Fulltext' должен подойти для такой задачи,Вам кажется. Кроме того что фуллтекст вообще не для этого, он еще и работать будет относительно медленно, так как вариативность значений будет низкая. Про "удобство" работы со строкой вместо нормального индекса вообще молчу.
Нужно, чтобы можно было быстро находить все темы (топики) для одного заданного раздела (искать тему, которая относится сразу к двум и более разделам не нужно).м2м, это надежно и быстро, достаточно знать индекс раздела.
Как такое реализовать максимально просто?Совет: Не гонитесь за кажущейся простотой, вы хапнете гораздо больше гемора от неправильной архитектуры, нежели от еще 15 минут, потраченных на создание таблицы справочника, пивот таблицы и написания 2 джоинов в запросе. Важнее сделать правильно, а не проще.
$name = 'My\\Name\\Space\\'.'ClassName';
new $name();
new ClassName();
$error = $this->handle($json);
if ($error === '') {
// логируем что все ок
} else {
// логируем ошибку
}
returnFullOrderInfo
можно переименовать в makeFullOrderInfoResponse
- в названиях функций слово return
не несёт ценности.fullInfo
тоже можно переименовать в (to|make|get)FullInfo
для того, чтобы по названию было понятно, что метод делает.responseSuccess
тоже криво назван.$warning
не указан тип?$warning
связан непосредственно с заказом, то его имеет смысл передавать в качестве аргумента в fullInfo
, чтобы инкапсулировать и не менять объект снаружи. Если же не связан, то формат ответа лучше поменять на ['data' => $orderInfo, 'warning' => $warning]
.