?
| Current Path : /home/webyoo/www/leumi/site/ |
| Current File : /home/webyoo/www/leumi/site/generate_fake_properties.php |
<?php
/**
* generate_fake_properties.php
*
* Genere 100 biens fictifs repartis sur les 5 categories de la page d'accueil
* d'Ashkara, telecharge des images Pexels (cuisine + salon) dans /images/,
* puis insere les biens en BDD avec un user dedie demo@ashkara.co.
*
* USAGE :
* 1) Obtenir une cle API gratuite : https://www.pexels.com/api/ (1 minute)
* 2) Renseigner $PEXELS_API_KEY ci-dessous
* 3) Uploader ce fichier a la racine du site (a cote de start.php)
* 4) Lancer dans le navigateur : https://www.ashkara.co/generate_fake_properties.php?run=1
* 5) Pour tout supprimer plus tard : ?cleanup=1
* 6) IMPORTANT : supprimer ce fichier du serveur apres usage
*/
include 'start.php'; // fournit $link (mysqli)
// ============== CONFIG ==============
$PEXELS_API_KEY = 'LnYkrRgYqJUnmNVVRTKFVFUNzv4N4slSXqOwcd897AkkjqHyXxkZNBzj';
$DEMO_EMAIL = 'demo@ashkara.co';
$DEMO_NAME = 'Demo Ashkara';
$DEMO_PASSWORD = 'demoAshkara2026';
$DEMO_TEL = '0500000000';
$IMAGES_DIR = __DIR__ . '/images/';
$NB_PROPERTIES = 100; // 20 par categorie
$IMG_W = 1200; // taille cible (single page)
$IMG_H = 800; // ratio 3:2, ok pour cards & single
// ====================================
set_time_limit(0);
ini_set('memory_limit', '512M');
header('Content-Type: text/plain; charset=utf-8');
mysqli_set_charset($link, 'utf8mb4');
if (!isset($_GET['run']) && !isset($_GET['cleanup'])) {
exit("Ajouter ?run=1 pour lancer la generation, ou ?cleanup=1 pour supprimer les fakes.\n");
}
// =========================================================
// CLEANUP
// =========================================================
if (isset($_GET['cleanup'])) {
$emailEsc = mysqli_real_escape_string($link, $DEMO_EMAIL);
$r = mysqli_query($link, "SELECT id FROM rent_users WHERE email='$emailEsc' LIMIT 1");
if (!$r || !($u = mysqli_fetch_assoc($r))) {
exit("Aucun user demo trouve.\n");
}
$uid = (int)$u['id'];
// recuperer les noms d'images pour les supprimer du disque
$rs = mysqli_query($link, "SELECT list_images FROM rent_properties WHERE id_user=$uid");
$deletedFiles = 0;
while ($row = mysqli_fetch_assoc($rs)) {
foreach (explode(',', $row['list_images']) as $f) {
$f = trim($f);
if ($f && file_exists($IMAGES_DIR . $f)) {
@unlink($IMAGES_DIR . $f);
$deletedFiles++;
}
}
}
mysqli_query($link, "DELETE FROM rent_properties WHERE id_user=$uid");
$deletedRows = mysqli_affected_rows($link);
mysqli_query($link, "DELETE FROM rent_wishlist WHERE id_user=$uid");
mysqli_query($link, "DELETE FROM rent_users WHERE id=$uid");
exit("Cleanup OK : $deletedRows biens supprimes, $deletedFiles fichiers images supprimes, user demo supprime.\n");
}
// =========================================================
// GENERATION
// =========================================================
if ($PEXELS_API_KEY === '') {
exit("ERREUR : il faut renseigner \$PEXELS_API_KEY (cle gratuite sur pexels.com/api/).\n");
}
if (!is_dir($IMAGES_DIR)) {
exit("ERREUR : dossier introuvable : $IMAGES_DIR\n");
}
if (!is_writable($IMAGES_DIR)) {
exit("ERREUR : dossier non inscriptible : $IMAGES_DIR (chmod 755)\n");
}
echo "=== Generation de $NB_PROPERTIES biens fictifs ===\n\n";
// --- DIAGNOSTIC ---
echo "DIAGNOSTIC :\n";
echo " PHP version : " . PHP_VERSION . "\n";
echo " __DIR__ : " . __DIR__ . "\n";
echo " IMAGES_DIR : $IMAGES_DIR\n";
echo " IMAGES_DIR exists : " . (is_dir($IMAGES_DIR) ? 'OUI' : 'NON') . "\n";
echo " IMAGES_DIR write : " . (is_writable($IMAGES_DIR) ? 'OUI' : 'NON') . "\n";
echo " GD extension : " . (extension_loaded('gd') ? 'OUI' : 'NON !!!') . "\n";
echo " cURL extension : " . (extension_loaded('curl') ? 'OUI' : 'NON !!!') . "\n";
if (extension_loaded('gd')) {
$gd = gd_info();
echo " GD JPEG support : " . (!empty($gd['JPEG Support']) ? 'OUI' : 'NON') . "\n";
echo " GD PNG support : " . (!empty($gd['PNG Support']) ? 'OUI' : 'NON') . "\n";
echo " GD WebP support : " . (!empty($gd['WebP Support']) ? 'OUI' : 'NON') . "\n";
}
echo "\n";
if (!extension_loaded('gd')) {
exit("ARRET : extension GD absente. Active-la dans la config PHP de l'hebergeur.\n");
}
if (!extension_loaded('curl')) {
exit("ARRET : extension cURL absente.\n");
}
// --- 1) User demo ---
$emailEsc = mysqli_real_escape_string($link, $DEMO_EMAIL);
$res = mysqli_query($link, "SELECT id FROM rent_users WHERE email='$emailEsc' LIMIT 1");
if ($row = mysqli_fetch_assoc($res)) {
$demoUserId = (int)$row['id'];
echo "User demo existant : id=$demoUserId\n";
} else {
$name = mysqli_real_escape_string($link, $DEMO_NAME);
$pass = mysqli_real_escape_string($link, $DEMO_PASSWORD);
$tel = mysqli_real_escape_string($link, $DEMO_TEL);
mysqli_query($link, "INSERT INTO rent_users (email, mdp, name, tel, fk_type, agreed_conditions)
VALUES ('$emailEsc', '$pass', '$name', '$tel', 1, 1)");
$demoUserId = mysqli_insert_id($link);
echo "User demo cree : id=$demoUserId (email=$DEMO_EMAIL pass=$DEMO_PASSWORD)\n";
}
// --- 2) Pool d'images Pexels ---
echo "\nRecuperation des URLs Pexels...\n";
function fetch_pexels($query, $perPage, $page, $apiKey) {
$url = "https://api.pexels.com/v1/search?query=" . urlencode($query)
. "&per_page=$perPage&page=$page&orientation=landscape&size=medium";
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["Authorization: $apiKey"],
CURLOPT_TIMEOUT => 30,
]);
$body = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($code !== 200) return [];
$j = json_decode($body, true);
if (empty($j['photos'])) return [];
$out = [];
foreach ($j['photos'] as $p) {
$out[] = $p['src']['large'] ?? $p['src']['medium'];
}
return $out;
}
$kitchenUrls = [];
$salonUrls = [];
foreach (['modern kitchen', 'kitchen interior', 'apartment kitchen'] as $q) {
for ($p = 1; $p <= 2; $p++) {
$kitchenUrls = array_merge($kitchenUrls, fetch_pexels($q, 30, $p, $PEXELS_API_KEY));
}
}
foreach (['modern living room', 'living room interior', 'apartment lounge'] as $q) {
for ($p = 1; $p <= 2; $p++) {
$salonUrls = array_merge($salonUrls, fetch_pexels($q, 30, $p, $PEXELS_API_KEY));
}
}
$kitchenUrls = array_values(array_unique($kitchenUrls));
$salonUrls = array_values(array_unique($salonUrls));
shuffle($kitchenUrls);
shuffle($salonUrls);
echo " Cuisines : " . count($kitchenUrls) . "\n";
echo " Salons : " . count($salonUrls) . "\n";
if (count($kitchenUrls) < $NB_PROPERTIES || count($salonUrls) < $NB_PROPERTIES) {
exit("ERREUR : pas assez d'images Pexels recuperees (verifier la cle API).\n");
}
// --- 3) Helpers image ---
function download_image($url, $dest, &$err = '') {
$fp = fopen($dest, 'w+');
if (!$fp) { $err = "fopen impossible : $dest"; return false; }
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_FILE => $fp,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_TIMEOUT => 60,
CURLOPT_USERAGENT => 'Mozilla/5.0',
CURLOPT_SSL_VERIFYPEER => false,
]);
$ok = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$cerr = curl_error($ch);
curl_close($ch);
fclose($fp);
$size = file_exists($dest) ? filesize($dest) : 0;
if (!$ok || $code !== 200 || $size < 1000) {
$err = "curl ok=$ok code=$code size=$size cerr=$cerr";
return false;
}
return true;
}
function resize_crop($src, $dest, $w, $h, &$err = '') {
$info = @getimagesize($src);
if (!$info) { $err = "getimagesize a echoue (fichier corrompu ?)"; return false; }
switch ($info['mime']) {
case 'image/jpeg': $im = @imagecreatefromjpeg($src); break;
case 'image/png': $im = @imagecreatefrompng($src); break;
case 'image/webp': $im = @imagecreatefromwebp($src); break;
default: $err = "mime non supporte : " . $info['mime']; return false;
}
if (!$im) { $err = "imagecreatefrom* a echoue"; return false; }
$sw = imagesx($im); $sh = imagesy($im);
$tr = $w / $h; $sr = $sw / $sh;
if ($sr > $tr) {
$cw = (int)($sh * $tr); $ch_ = $sh; $sx = (int)(($sw - $cw) / 2); $sy = 0;
} else {
$cw = $sw; $ch_ = (int)($sw / $tr); $sx = 0; $sy = (int)(($sh - $ch_) / 2);
}
$dst = imagecreatetruecolor($w, $h);
imagecopyresampled($dst, $im, 0, 0, $sx, $sy, $w, $h, $cw, $ch_);
$ok = imagejpeg($dst, $dest, 85);
imagedestroy($im); imagedestroy($dst);
if (!$ok || !file_exists($dest)) { $err = "imagejpeg a echoue (ecriture vers $dest)"; return false; }
return true;
}
function ins_val($link, $v) {
if (is_int($v) || is_float($v)) return (string)$v;
if ($v === null) return 'NULL';
return "'" . mysqli_real_escape_string($link, (string)$v) . "'";
}
// --- 4) Donnees Israel ---
$cities = [
['转诇 讗讘讬讘', 32.0853, 34.7818, '转诇 讗讘讬讘'],
['专诪转 讙谉', 32.0719, 34.8225, '专诪转 讙谉'],
['谞转谞讬讛', 32.3215, 34.8532, '谞转谞讬讛'],
];
$neighborhoods = ['专讞讘讬讛', '讛爪驻讜谉 讛讬砖谉', '驻诇讜专谞讟讬谉', '谞讜讜讛 爪讚拽', '讘讘诇讬',
'谞讜讜讛 讗讘讬讘讬诐', '讛讚专', '诪专讻讝 讛注讬专', '讬讚 讗诇讬讛讜', '谞讞诇转 讘谞讬诪讬谉',
'讙讘注转 砖诪讜讗诇', '谞讜讜讛 讙谉', '专诪转 讗讘讬讘', '讻专诪诇讬讛'];
$streets = ['讘讬讗诇讬拽', '讛专爪诇', '讚讬讝谞讙讜祝', '讗讘谉 讙讘讬专讜诇', '讘谉 讬讛讜讚讛',
'专讜讟砖讬诇讚', '讛讬专拽讜谉', '讗诇谞讘讬', '讛谞砖讬讗', '讜讬爪诪谉',
'讝\'讘讜讟讬谞住拽讬', '讗专诇讜讝讜专讜讘', '谞讜专讚讗讜', '住讜拽讜诇讜讘', '讛讙诇讬诇'];
$titles = [
'讚讬专讛 诪砖讜驻爪转 讜诪专讛讬讘讛',
'讚讬专转 讞诇讜诐 讘专讞讜讘 砖拽讟',
'讚讬专讛 诪讜讚专谞讬转 注诐 谞讜祝 驻转讜讞',
'讚讬专讛 诪讗讜讘讝专转 讜诪讜讗专转',
'讚讬专讛 讗讬讻讜转讬转 诇讛砖讻专讛',
'讚讬专讛 谞讚讬专讛 讘诪讬拽讜诐 诪讘讜拽砖',
'讚讬专讛 专讞讘讛 讜诪讗讜讜专转',
];
$descBase = '讚讬专讛 诪拽住讬诪讛 讘诪讬拽讜诐 诪爪讜讬谉, 拽专讜讘讛 诇转讞讘讜专讛 爪讬讘讜专讬转, 诪专讻讝讬 拽谞讬讜转 讜诪讜住讚讜转 讞讬谞讜讱. 讛讚讬专讛 诪讗讜讜专专转, 诪讜讗专转 讜讘诪爪讘 诪爪讜讬谉. 专讬爪讜祝 拽专诪讬拽讛, 诪讟讘讞 讞讚砖 诪讗讜讘讝专, 讞诇讜谞讜转 讗诇讜诪讬谞讬讜诐 讻驻讜诇讬诐. 诪转讗讬诪讛 诇诪砖驻讞讛 讗讜 诇讝讜讙. 谞讬转谉 诇讛讬讻谞住 诪讬讬讚讬转.';
$infos2Base = '讛讚讬专讛 讻讜诇诇转: 诪拽专专, 转谞讜专, 诪讻讜谞转 讻讘讬住讛, 诪讬拽专讜讙诇, 诪讬讟讛, 讗专讜谞讜转, 住驻讛 讜讟诇讜讜讬讝讬讛. 诪讜讻谞讛 诇讻谞讬住讛.';
// --- 5) Definition des 5 categories ---
// Chaque cat fixe le critere principal (mamad / parking / shelter / nb_rooms)
// pour qu'elle soit detectable par les filtres de l'index.
$categories = [
'mamad' => [ // 讚讬专讜转 注诐 诪诪"讚
'mamad' => '讻谉',
'shelter' => '',
'mamak' => '',
'parking' => '0',
'rooms' => [3, 5],
],
'couple' => [ // 讚讬专讜转 诇讝讜讙讜转 爪注讬专讬诐 2-3 讞讚专讬诐
'mamad' => '诇讗',
'shelter' => '',
'mamak' => '',
'parking' => '0',
'rooms' => [2, 3],
],
'parking' => [ // 讚讬专讜转 注诐 讞谞讬讛
'mamad' => '诇讗',
'shelter' => '',
'mamak' => '',
'parking' => '1',
'rooms' => [2, 5],
],
'shelter' => [ // 讚讬专讜转 砖讬砖 诪拽诇讟 讘讘谞讬讬谉
'mamad' => '诇讗',
'shelter' => '讻谉',
'mamak' => '讻谉',
'parking' => '0',
'rooms' => [2, 5],
],
'family' => [ // 讚讬专讜转 诇诪砖驻讞讛 4-5 讞讚专讬诐
'mamad' => '诇讗',
'shelter' => '',
'mamak' => '',
'parking' => '0',
'rooms' => [4, 5],
],
];
$perCat = (int)($NB_PROPERTIES / count($categories));
// --- 6) Boucle de generation ---
$inserted = 0;
$failed = 0;
$idx = 0;
foreach ($categories as $catName => $cfg) {
echo "\n--- Categorie : $catName ($perCat biens) ---\n";
for ($i = 1; $i <= $perCat; $i++) {
$cityRow = $cities[array_rand($cities)];
[$cityName, $latC, $lngC, $region] = $cityRow;
$lat = $latC + (mt_rand(-300, 300) / 100000.0);
$lng = $lngC + (mt_rand(-300, 300) / 100000.0);
$rooms = mt_rand($cfg['rooms'][0], $cfg['rooms'][1]);
$surface = $rooms * mt_rand(22, 35);
$floor = mt_rand(0, 8);
$nbFloor = $floor + mt_rand(0, 5);
$price = mt_rand(35, 95) * 100; // 3 500 - 9 500 NIS
$arnona = mt_rand(400, 1500);
$vaad = mt_rand(80, 500);
$bath = ($rooms >= 4) ? 2 : 1;
$title = $titles[array_rand($titles)] . " - $rooms 讞讚专讬诐, $cityName";
$name = $title;
$address = $streets[array_rand($streets)] . ' ' . mt_rand(1, 120) . ', ' . $cityName;
$neigh = $neighborhoods[array_rand($neighborhoods)];
$dateEntry = date('Y-m-d', strtotime('+' . mt_rand(0, 60) . ' days'));
// --- Images ---
$kUrl = $kitchenUrls[$idx];
$sUrl = $salonUrls[$idx];
$idx++;
$stamp = date('Ymd_His') . '_' . mt_rand(1000, 9999);
$kFilename = "demo_{$catName}_kitchen_{$i}_{$stamp}.jpg";
$sFilename = "demo_{$catName}_salon_{$i}_{$stamp}.jpg";
$kPath = $IMAGES_DIR . $kFilename;
$sPath = $IMAGES_DIR . $sFilename;
$kTmp = $kPath . '.tmp';
$sTmp = $sPath . '.tmp';
$errDl = ''; $errRz = '';
if (!download_image($sUrl, $sTmp, $errDl)) {
echo " [$i] ECHEC dl salon : $errDl url=$sUrl\n";
@unlink($sTmp); $failed++; continue;
}
if (!resize_crop($sTmp, $sPath, $IMG_W, $IMG_H, $errRz)) {
echo " [$i] ECHEC resize salon : $errRz\n";
@unlink($sTmp); @unlink($sPath); $failed++; continue;
}
@unlink($sTmp);
if (!download_image($kUrl, $kTmp, $errDl)) {
echo " [$i] ECHEC dl cuisine : $errDl url=$kUrl\n";
@unlink($kTmp); @unlink($sPath); $failed++; continue;
}
if (!resize_crop($kTmp, $kPath, $IMG_W, $IMG_H, $errRz)) {
echo " [$i] ECHEC resize cuisine : $errRz\n";
@unlink($kTmp); @unlink($kPath); @unlink($sPath); $failed++; continue;
}
@unlink($kTmp);
// salon en premier (image principale)
$listImages = $sFilename . ',' . $kFilename;
// --- INSERT ---
$row = [
'name_property' => $name,
'surface' => $surface,
'nb_rooms' => $rooms,
'price_monthly' => $price,
'price_vaad' => $vaad,
'price_arnona' => $arnona,
'title' => $title,
'description' => $descBase,
'date_entry' => $dateEntry,
'type_property' => '讚讬专讛',
'type_location' => '谞讻住 驻专讟讬',
'list_images' => $listImages,
'latitude' => $lat,
'longitude' => $lng,
'address' => $address,
'region' => $region,
'city' => $cityName,
'neighborhood' => $neigh,
'floor' => $floor,
'nb_floor' => $nbFloor,
'parking' => $cfg['parking'],
'elevator' => (mt_rand(0, 1) ? '讻谉' : '诇讗'),
'air_cond' => '讻谉',
'mamad' => $cfg['mamad'],
'multib_doors' => (mt_rand(0, 1) ? '讻谉' : '诇讗'),
'bars' => (mt_rand(0, 1) ? '讻谉' : '诇讗'),
'heater' => '讻谉',
'storeroom' => (mt_rand(0, 1) ? '讻谉' : '诇讗'),
'accessibility' => (mt_rand(0, 3) === 0 ? '讻谉' : '诇讗'),
'pets' => (mt_rand(0, 1) ? '讻谉' : '诇讗'),
'balcony' => (mt_rand(0, 1) ? '讻谉' : '诇讗'),
'courtyard' => (mt_rand(0, 2) === 0 ? '讻谉' : '诇讗'),
'heating' => '诪砖讘讬',
'more_infos' => '',
'refrigerator' => 1,
'tanur' => 1,
'kira' => mt_rand(0, 1),
'micro' => 1,
'kelim' => mt_rand(0, 1),
'kvisa' => 1,
'meyavesh' => mt_rand(0, 1),
'shida' => mt_rand(0, 1),
'tv' => mt_rand(0, 1),
'mita' => mt_rand(0, 1),
'salon' => 1,
'shulhan' => 1,
'aron' => 1,
'more_infos2' => $infos2Base,
'date_creation' => date('Y-m-d'),
'publish' => 1,
'id_user' => $demoUserId,
'status' => 3, // 驻注讬诇
'status_bid' => '',
'tornado' => '',
'nb_bathrooms' => $bath,
'verified' => 1,
'confirm_by' => 1,
'renovated' => (mt_rand(0, 1) ? '讻谉' : ''),
'furnished' => (mt_rand(0, 1) ? '讻谉' : ''),
'exclusive' => '',
'roommates' => '',
'mamak' => $cfg['mamak'],
'shelter' => $cfg['shelter'],
];
$cols = '`' . implode('`,`', array_keys($row)) . '`';
$vals = implode(',', array_map(fn($v) => ins_val($link, $v), array_values($row)));
$sql = "INSERT INTO rent_properties ($cols) VALUES ($vals)";
if (!mysqli_query($link, $sql)) {
echo " [$i] ECHEC SQL : " . mysqli_error($link) . "\n";
@unlink($kPath); @unlink($sPath);
$failed++; continue;
}
$inserted++;
echo " [$i] OK $rooms ch. / {$surface}m2 / $price NIS / $cityName\n";
}
}
echo "\n===========================================\n";
echo "TERMINE : $inserted biens inseres, $failed echecs.\n";
echo "User demo : id=$demoUserId ($DEMO_EMAIL)\n";
echo "Pour supprimer : ?cleanup=1\n";
echo "N'OUBLIE PAS de supprimer ce fichier du serveur !\n";