| Current Path : /home/h/e/l/helpink/www/ |
| Current File : /home/h/e/l/helpink/www/bob1.php |
<?php
declare(strict_types=1);
ini_set('display_errors', '0');
error_reporting(E_ALL);
header('Content-Type: application/json; charset=utf-8');
function out(array $a, int $code=200): void {
http_response_code($code);
echo json_encode($a, JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);
exit;
}
// --------- CONFIG DB (EN DUR) ----------
$DB_HOST = "helpinkhb.mysql.db:3306"; // ex: "localhost" ou "helpinkhb.mysql.db"
$DB_NAME = "helpinkhb"; // ex: "helpinkhb"
$DB_USER = "helpinkhb";
$DB_PASS = "Weg14vgkHib";
// Table principale
$TABLE = "cpj7c_jbusinessdirectory_companies";
// Limites anti coût
$MAX_RESULTS = 5;
$MAX_QUERY_LEN = 200; // anti abus
// --------- INPUT ----------
$raw = file_get_contents('php://input') ?: '';
$data = json_decode($raw, true);
$q = trim((string)($data['question'] ?? ''));
if ($q === '') out(["ok"=>false, "error"=>"Message vide"], 400);
if (mb_strlen($q) > $MAX_QUERY_LEN) out(["ok"=>false, "error"=>"Question trop longue"], 400);
// --------- Scope guard simple (sans IA) ----------
$allowed = ['cpa', 'cpas', 'repas', 'manger', 'hébergement', 'dormir', 'accueil', 'jurid', 'sant', 'soin', 'douche', 'sans-abri', 'sdf', 'aide', 'asile', 'migrant'];
$inScope = false;
$lower = mb_strtolower($q);
foreach ($allowed as $w) {
if (mb_strpos($lower, $w) !== false) { $inScope = true; break; }
}
if (!$inScope) {
out([
"ok"=>true,
"reply"=>"Je suis là pour aider autour du logement, des repas, de l’hygiène et du soutien aux personnes sans abri à Bruxelles. Si tu as une question dans ce domaine, je ferai de mon mieux pour t’aider."
]);
}
// --------- DB CONNECT ----------
try {
$pdo = new PDO(
"mysql:host=$DB_HOST;dbname=$DB_NAME;charset=utf8mb4",
$DB_USER,
$DB_PASS,
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
]
);
} catch (Throwable $e) {
out(["ok"=>false, "error"=>"Erreur DB: ".$e->getMessage()], 500);
}
// --------- KEYWORDS (simple) ----------
$parts = preg_split('/\s+/', $lower);
$parts = array_values(array_filter($parts, fn($x)=>mb_strlen($x) >= 3));
$parts = array_slice($parts, 0, 5);
if (!$parts) $parts = [$lower];
// --------- SQL (1 requête) ----------
$where = [];
$params = [];
foreach ($parts as $i => $kw) {
$where[] = "(name LIKE :k$i OR short_description LIKE :k$i OR description LIKE :k$i OR address LIKE :k$i OR city LIKE :k$i)";
$params[":k$i"] = "%$kw%";
}
$sql = "
SELECT name, address, city, postalCode, phone, website
FROM $TABLE
WHERE approved = 2 AND state = 1
AND (" . implode(" OR ", $where) . ")
LIMIT $MAX_RESULTS
";
try {
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
$rows = $stmt->fetchAll();
} catch (Throwable $e) {
out(["ok"=>false, "error"=>"Erreur SQL: ".$e->getMessage()], 500);
}
if (!$rows) {
out(["ok"=>true, "reply"=>"Je n’ai rien trouvé correspondant exactement à ta demande pour le moment. Essaie avec un autre mot (ex : CPAS, repas, accueil, hébergement)."]);
}
$html = "Voici ce que j’ai trouvé :<br><br>";
foreach ($rows as $r) {
$name = htmlspecialchars((string)$r['name']);
$addr = htmlspecialchars(trim((string)$r['address']));
$city = htmlspecialchars((string)$r['city']);
$cp = htmlspecialchars((string)($r['postalCode'] ?? ''));
$phone = htmlspecialchars((string)($r['phone'] ?? ''));
$web = htmlspecialchars((string)($r['website'] ?? ''));
$html .= "<b>$name</b><br>";
$html .= "$addr – $cp $city<br>";
if ($phone !== '') $html .= "📞 $phone<br>";
if ($web !== '') $html .= "$web<br>";
$html .= "<br>";
}
out(["ok"=>true, "reply"=>$html]);