Aldığın hata mesajından anlaşılan o ki,
react-apollo paketi, graphql paketinin "^14.3.1" sürümünü gerektiriyor.
@apollo/client paketi de graphql paketinin "^15.0.0" veya "^16.0.0" sürümünü gerektiriyor.
Bu çakışma nedeniyle npm, graphql paketinin hangi sürümüne karar vereceğini bilemiyor.
Sorun olmayacaksa, graphql paketinin güncel sürümünü yüklersen çakışma çözülür gibi görünüyor.
Bunun için package.json dosyandaki dependencies bölümünde graphql sürümünü bulup güncel sürümü verebilirsin. Örn:
"dependencies": {
"react-apollo": "^3.1.5",
"@apollo/client": "^3.9.6"
"graphql": "^16.8.1",
}
İşe yarar mı bilmem tabi.
ChatGPT API'sini hiç kullanmadım. Yalnızca fikir vermek için cevap veriyorum.
İnternette yabancı kaynaklardan, özellikle de Open AI'ın kendi forumlarından araştırma yaptım.
Anlaşılan o ki, API geçmiş konuşmaları hatırlamak için bir yol sunmuyor. Bu durumda da bahsettiğin gibi geçmiş konuşmayı hafızada tutup yeni konuşma başladığında önce eski konuşmayı ona göndermek gerektiği söylenmiş. Ama elbette söylediğin gibi bu da her konuşmanın başında bir sürü token göndermek anlamına geliyor ve maliyeti çok artırıyor.
İşe yarar mı bilmiyorum ama benim fikrim şu ki,
Geçmiş konuşmaları kendi sisteminizde tutun. (mesela bir veritabanı veya json dosyaları olarak)
Daha sonra bu verilere erişebilecek bir kanal açın. Mesela chat yapılan web sitenizde history.php adlı bir dosya oluşturup buna GET isteği ile ulaşılabilmesini sağlayın.
history.php, GET ile yapılan isteklerden historytoken ve id adlı 2 query string parametresi alsın. Burada historytoken parametresi güvenlik için, id parametresi de hangi kullanıcıyla yapılan görüşmelerin hatırlanacağını belirtmek için kullanılacak.
Daha sonra ChatGPT'ye yeni bir konuşmaya başlamadan önce, sizin sunucunuzdaki history.php sayfasına GET isteği atmasını söyleyin.
Mesela bir kullanıcı konuşmaya başladığında siz ChatGPT'ye ilk mesaj olarak şunu verin:
"Bu kullanıcıyla ilgili konuşmalara, xxx linkinden alacağın geçmiş konuşmalara göre devam et."
gibi bir mesaj...
Burada xxx ifadesi, sizin history.php sayfanızın url'si. Örneğin:
https://prototurk.com/history.php?historytoken=yyy&userid=zzz
yyy, sizin tarafınızdan oluşturlan ve history.php tarafından doğrulanabilecek bir şifre.
zzz ise konuşmaya başlayacak kullanıcıya atanmış bir id değeri olacak. İlk kez konuşuyor olsa bile her kullanıcıya benzersiz bir id atayın.
history.php dosyası öncelikle historytoken parametresinden şifreyi doğrulasın. Sonra id parametresinden gelen değer için daha önce bir konuşma verisi var mı diye kontrol edin. Eğer yoksa boş dizi dönebilirsiniz.
Eğer id'nin karşılığı varsa bu değerleri gönderin. Mesela bir geçmiş konuşma json örneği:
[
{"user": "Merhaba, ben Eren", "anwser": "Tanıştığıma memnun oldum Eren, sana nasıl yardımcı olabilirim?"},
{"user": "Sen kimsin?", "answer": "Ben bir yapay zeka sohbet botuyum."}
]
Böylece konuşmaya başlarken ChatGPT'ye tek cümlelik bir ifade göndermiş olacaksınız ve o sizin siteniz üzerinden yüzlerce mesajlık konuşmaları inceleyip hafızasını tazelemiş olacak.
Denemek lazım...
Bir ChatGPT sohbeti (sadeleştirilmiş)
ChatGPT 3.5:
1) xampp'i silip baştan kurabilirsiniz.
2) yedeğiniz varsa veritabanını onarmayı deneyebilirsiniz:
mysqlcheck --all-databases --auto-repair -u root -p
yönetici şifresi isteyebilir.
3) Hata mesajı, eksik InnoDB log dosyalarının olabileceğini belirtiyor.
İlgili log dosyalarını kontrol edin ve eğer eksikse, onları kopyalayarak veritabanınızı düzeltebilirsiniz.
Ben: Eksik InnoDB log dosyaları?
ChatGPT 3.5:
Eksik log dosyalarını kontrol etmek, özellikle MySQL'in InnoDB motoru için kullanılan log dosyalarını kontrol etmek anlamına gelir.
Bu log dosyaları, veritabanı işlemlerinin günlüklerini tutar ve veritabanının tutarlılığını sağlamak için önemlidir.
Eğer InnoDB log dosyaları eksik veya bozuksa, veritabanınız düzgün şekilde başlatılamaz.
Bu nedenle, eksik log dosyalarını kontrol etmek ve gerekirse onları sağlam bir kaynaktan kopyalamak önemlidir.
İşte bu işlemi gerçekleştirmenin adımları:
1) InnoDB Log Dosyalarını Bulma:
İlk olarak, MySQL veritabanının ana dizinindeki log dosyalarını bulmanız gerekir.
Genellikle, bu dosyalar ib_logfile0, ib_logfile1 gibi adlar alır.
Ancak, XAMPP gibi hazır paketlerde bu dosyaların yeri farklı olabilir.
Bu nedenle, XAMPP'inizin MySQL dizininde bu dosyaları aramanız gerekecek.
2) Log Dosyalarını Kopyalama:
Eğer log dosyaları eksik veya bozuksa, bunları sağlam bir kaynaktan kopyalamanız gerekir.
Bu, önceden yedeklenmiş bir sistemden, başka bir çalışan MySQL kurulumundan veya sağlam bir XAMPP kurulumundan olabilir.
3) XAMPP MySQL Dizinine Yerleştirme:
Eksik veya bozuk log dosyalarını sağlam olanlarla değiştirin.
Bu, XAMPP'in MySQL dizinindeki eksik log dosyalarını bulmanız ve onları sağlam olanlarla değiştirmeniz gerektiği anlamına gelir.
4) MySQL'i Yeniden Başlatma:
Log dosyalarını değiştirdikten sonra, MySQL'i yeniden başlatın ve hatanın çözülüp çözülmediğini kontrol edin.
Eğer bu adımları takip ederseniz ve eksik veya bozuk log dosyalarını doğru şekilde değiştirirseniz, MySQL'inizi düzgün şekilde başlatmanız gerektiğini umarız.
Ben (ChatGPT 4'e): Senden önceki sürüm log dosyalarının yerini bilemedi, sen söyle...
ChatGPT 4:
XAMPP, web geliştiricileri arasında popüler bir PHP, MariaDB (MySQL'in bir çatalı) ve Apache sunucusunu içeren bir pakettir.
XAMPP'te MySQL veya MariaDB için InnoDB log dosyalarının yerini bulmak istiyorsanız, genellikle mysql\data veya mariadb\data klasörü altında bulunurlar.
Ancak, XAMPP sürümüne ve işletim sisteminize bağlı olarak bu konum farklılık gösterebilir.
İşte genel bir rehber:
XAMPP Kontrol Panelini Açın: XAMPP kontrol panelini açarak MySQL veya MariaDB servislerinin durumunu kontrol edin. Bu servislerin çalışıp çalışmadığını buradan görebilirsiniz.
MySQL/MariaDB Data Dizini: XAMPP'in kurulu olduğu dizine gidin. Genellikle Windows'ta C:\xampp ya da macOS/Linux'ta /opt/lampp olabilir. Ardından, mysql\data veya mariadb\data dizinine gidin. İşletim sisteminiz ve XAMPP sürümünüz bu yolu değiştirebilir. Bu dizinde ib_logfile0, ib_logfile1 gibi InnoDB log dosyalarını bulabilirsiniz.
Dosyaları Değiştirme: Eğer InnoDB log dosyalarınız eksik veya bozuksa, burada sağlam bir kaynaktan alınan dosyalarla değiştirebilirsiniz. Sağlam kaynak, başka bir XAMPP kurulumu, yedeklenmiş dosyalar ya da başka bir çalışır durumdaki MySQL/MariaDB kurulumu olabilir.
Servisi Yeniden Başlatma: Dosyaları değiştirdikten sonra, XAMPP kontrol panelinden MySQL veya MariaDB servisini yeniden başlatmayı unutmayın. Bu, yapılan değişikliklerin etkili olması için gereklidir.
Bu adımları takip ederek InnoDB log dosyaları ile ilgili sorunları çözebilirsiniz. Ancak, herhangi bir veri kaybı riskine karşı işlemlere başlamadan önce mevcut veritabanınızın yedeğini almanızı öneririm.
O zaman daha sert tedbirler alalım :)
background-size: 100vw auto;
background-position: top center;
background-size: cover;
yerine
background-size: 100% auto;
background-position: top center;
verilebilir.
Başka bir sorunuza dayanarak bunları veritabanında tutmak istediğinizi anlıyorum.
Veritabanınızda 4 adet tablo olmalı:
1) ulkeler (şimdilik tek ülke olacak olsa da...)
id: int & primary key & auto increment
isim: text
2) bolgeler (her bölge/eyalet bir ülkeye ait olmalıdır. ulkeler tablosuyla bire çok ilişki)
id: int & primary key & auto increment
ulke_id: int
isim: text
3) iller (her il, bir bölgeye/eyalete ait olmalı)
id: int & primary key & auto increment
bolge_id: int
isim: text
4) ilceler (her ilçe, bir ile ait olmalı)
id: int & primary key & auto increment
il_id: int
isim: text
Bunlara ek olarak her ilçeye yönelik birkaç blog içeriği olabilir. İlçe seçildiğinde son yazılmış olan içeriği gösterirsiniz ve eski içeriklerin de başlıklarını gösterirsiniz. Kullanıcı tıklayınca o içeriklere de erişebilir.
5) icerikler (her içerik bir ilçeye ait olmalı)
id: int & primary key & auto increment
ilce_id: int
baslik: text
gorsel: text (içerik görselinin link'ini tutacak)
tarih: datetime (oluşturulan içerikler tarihe göre sıralanacak)
icerik: text (içerik metni html formatında burada yer alacak)
goruntulenme_sayisi: int (bunun gibi eklemeler de yapılabilir...)
Veritabanınızdaki bu tablolara manuel olarak örnek birkaç kayıt girmelisiniz. Tabi bu kayıtlar, id'ler eşleşecek şekilde tutarlı olmalı.
Örneğin:
1) ulkeler için 1 kayıt:
id: 1 (otomatik eklenecek)
isim: "Türkiye"
2) bolgeler için 1 kayıt:
id: 1 (otomatik eklenecek)
ulke_id: 1 (Türkiye'nin id'si)
isim: "Ege"
3) iller için 1 kayıt:
id: 1 (otomatik eklenecek)
bolge_id: 1 (Ege'nin id'si)
isim: "Manisa"
4) ilceler için 1 kayıt:
id: 1 (otomatik eklenecek)
il_id: 1 (Manisa'nın id'si)
isim: "Yunusemre"
5) icerikler için 1 kayıt:
id: 1 (otomatik eklenecek)
ilce_id: 1 (Yunusemre'nin id'si)
baslik: "Görülmeye değer yerler"
gorsel: https://upload.wikimedia.org/wikipedia/commons/thumb/9/94/Spil_Dağı'ndan_Yunusemre_ilçesi.jpg/500px-Spil_Dağı'ndan_Yunusemre_ilçesi.jpg
tarih: "2024-04-08 15:20:35"
icerik: "12 Kasım 2012'de Manisa il merkezinin ikiye bölünmesiyle..."
goruntulenme_sayisi: 3
Artık sayfa tasarımı başlayabilir.
Sayfada başlangıçta ülke seçimi yapılmalı. Yani ilk olarak ülkelerin veritabanından alınması gerek.
Ama her şeyden önce bazı yardımcı fonksiyonlara ihtiyacımız olacak. Mesela veritabanı bağlantısı için bir yardımcı...
Kök klasörde helpers adlı bir klasör açıp içine *database.php** adlı bir dosya oluşturabiliriz:
<?php
class Database {
private $host = "localhost";
private $dbname = "veritabani_adi";
private $username = "kullanici_adi";
private $password = "sifre";
private $conn;
public function __construct() {
$dsn = "mysql:host={$this->host};dbname={$this->dbname};charset=utf8mb4";
try {
$this->conn = new PDO($dsn, $this->username, $this->password);
$this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("Bağlantı hatası: " . $e->getMessage());
}
}
public function query($sql) {
return $this->conn->query($sql);
}
public function lastInsertId() {
return $this->conn->lastInsertId();
}
public function close() {
$this->conn = null;
}
}
Artık bu yardımcı sayesinde veritabanına bağlanıp veri çekebiliriz.
Şimdi veritabanımızla iletişim kurup bize istediğimiz verileri sunacak dosyalar oluşturmalıyız.
Kök klasörde models diye bir klasör oluşturup içine ulkeler_model.php adlı bir dosya oluşturalım.
<?php
require_once('../helpers/database.php');
class Ulkeler_Model {
private $db;
public function __construct() {
$this->db = new Database();
}
public function getUlkeler() {
$sql = "SELECT * FROM ulkeler";
$result = $this->db->query($sql);
return $result->fetchAll(PDO::FETCH_ASSOC);
}
}
Şimdi de bu model dosyasıyla iletişime geçip verileri alacak ve bize uygun bir formatta iletecek olan bir dosya oluşturalım.
Kök klasörde controllers adlı bir klasör açıp içine queries.php adlı bir dosya oluşturalım.
Bu dosyaya bazı fonksiyonlar olacak. Jquery'nin ajax'ı ile işimize yarayacak koşullarda istek atacağız ve bu dosya da bize json formatında ülkelerin listesini döndürecek.
<?php
header('Content-Type: application/json');
if(!isset($_POST['query'])) {
echo json_encode(['status'=>false, 'message'=>'Sorgu belirtilmedi.']);
exit();
}
$query = $_POST['query'];
if($query==='Ülke Listesi') {
require_once('../models/ulkeler_model.php');
$ulkeler_model = new Ulkeler_Model();
$ulkeler = $ulkeler_model->getUlkeler();
echo json_encode($ulkeler);
exit();
}
Bu sayfaya query='Ülke Listesi'
verisiyle POST isteği atarsak model'imiz yardımıyla bize ülkelerin listesini döndürecek.
Bunu hemen test edebilmek için kök klasörümüze index.html dosyası oluşturabiliriz.
Bu dosyada bir select elementimiz olacak. JQuery'nin ajax'ı yardımıyla az önce oluşturduğumuz sayfaya istek atıp ülke listesini alacağız.
Json formatında aldığımız ülke listesini select elementine option olarak ekleyeceğiz. (Tabi tablomuzda sadece Türkiye olduğu için bize tek bir veri gelecek.)
Stilleri araya karıştırmadan bir örnek veriyorum:
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Blog</title>
</head>
<body>
<h1>Blog</h1>
<select id="ulkeler">
<option value="">Ülke Seçiniz</option>
</select>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
$(document).ready(function(){
// Ajax isteği ile ülke listesini al
$.ajax({
type: 'POST',
url: 'controllers/queries.php',
data: {query: 'Ülke Listesi'},
dataType: 'json',
success: function(response){
// Gelen ülke listesini select elementine ekle
response.forEach(function(ulke){
$('#ulkeler').append('<option value="' + ulke.id + '">' + ulke.isim + '</option>');
});
},
error: function(xhr, status, error){
console.error('Ajax hatası:', error);
}
});
});
</script>
</body>
</html>
Projemize localhost üzerinden gidip bu sayfayı açtığımızda controller'daki dosyamıza bir istek atılacak ve ülkeler çekilecek.
Peki seçilen ülkeye göre bölgeleri nasıl alacağız? Bunun için queries.php dosyamıza bölgeleri döndürecek bir koşul eklemeliyiz.
Ama bolgeler tablosuyla iletişim kurmak için de models klasörümüze bolgeler_model.php diye bir dosya da eklemeliyiz.
models klasöründeki bolgeler_model.php
<?php
require_once('../helpers/database.php');
class Bolgeler_Model {
private $db;
public function __construct() {
$this->db = new Database();
}
public function getBolgeler($ulke_id) {
$sql = "SELECT * FROM bolgeler WHERE ulke_id = :ulke_id";
$result = $this->db->prepare($sql);
$result->bindParam(':ulke_id', $ulke_id, PDO::PARAM_INT);
$result->execute();
return $result->fetchAll(PDO::FETCH_ASSOC);
}
}
Veritabanımızla iletişim kuracak model'imizi oluşturduk.
Artık controllers klasöründeki queries.php dosyasına gerekli koşulu ekleyebiliriz:
<?php
header('Content-Type: application/json');
if (!isset($_POST['query'])) {
echo json_encode(['status' => false, 'message' => 'Sorgu belirtilmedi.']);
exit();
}
$query = $_POST['query'];
if ($query === 'Ülke Listesi') {
require_once('../models/ulkeler_model.php');
$ulkeler_model = new Ulkeler_Model();
$ulkeler = $ulkeler_model->getUlkeler();
echo json_encode($ulkeler);
exit();
}
if ($query === 'Bölge Listesi') {
require_once('../models/bolgeler_model.php');
if (!isset($_POST['ulke_id'])) {
echo json_encode(['status' => false, 'message' => 'Ülke id belirtilmedi.']);
exit();
}
$ulke_id = $_POST['ulke_id'];
$bolgeler_model = new Bolgeler_Model();
$bolgeler = $bolgeler_model->getBolgeler($ulke_id);
echo json_encode($bolgeler);
exit();
}
Artık index.html sayfamıza bölgeler için de bir select elementi ekleyebiliriz.
JQuery ile ülke seçimindeki değişikliği algılayıp bölgeler için istek atacağız ve ilgili select'e ekleyeceğiz.
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Blog</title>
</head>
<body>
<h1>Blog</h1>
<select id="ulkeler">
<option value="">Ülke Seçiniz</option>
</select>
<select id="bolgeler">
<option value="">Bölge Seçiniz</option>
</select>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
$(document).ready(function(){
// Ülkeleri al
$.ajax({
type: 'POST',
url: 'controllers/queries.php',
data: {query: 'Ülke Listesi'},
dataType: 'json',
success: function(response){
// Gelen ülke listesini select elementine ekle
response.forEach(function(ulke){
$('#ulkeler').append('<option value="' + ulke.id + '">' + ulke.isim + '</option>');
});
},
error: function(xhr, status, error){
console.error('Ajax hatası:', error);
}
});
// Ülke seçildiğinde bölgeleri al
$('#ulkeler').change(function(){
var ulke_id = $(this).val();
$.ajax({
type: 'POST',
url: 'controllers/queries.php',
data: {query: 'Bölge Listesi', ulke_id: ulke_id},
dataType: 'json',
success: function(response){
$('#bolgeler').empty().append('<option value="">Bölge Seçiniz</option>');
// Gelen bölge listesini select elementine ekle
response.forEach(function(bolge){
$('#bolgeler').append('<option value="' + bolge.id + '">' + bolge.isim + '</option>');
});
},
error: function(xhr, status, error){
console.error('Ajax hatası:', error);
}
});
});
});
</script>
</body>
</html>
Böylece sayfa yüklendiğinde önce ülkelerin listesi alınacak ve ilgili select'e eklenecek.
Kullanıcı bir ülke seçtiğinde de bölgelerin listesi alınacak ve ilgili select'e eklenecek.
Sırada bölge seçildiğinde il, il seçildiğinde de ilçe seçimi yapmak var.
Tabi ilçe seçildiğinde de ilçenin içeriklerini alacağız ve tarihe bakarak son girilen içeriği ekranda göstereceğiz.
Sayfanın altında da bu ilçenin daha eski tarihli içeriklerini listeleyeceğiz ve bunlardan birine basıldığında o içeriğin gelmesini sağlayacağız...
...
Biraz zamanım var diye böyle uzun uzun örnekler yazdım ama artık zamanım kalmadı.
Bu noktadan sonra cevabımı olduğu gibi alıp ChatGPT'ye yapıştırarak devam etmesini söylerseniz size yardımcı olacaktır diye düşünüyorum.
Artık GPT'nin mantığı anlayacağı kadar içerik yazdım sanırım. :)
1) Veritabanı nasıl olmalı?
Aşağıda bir örnekle açıkladım.
2) İllerle ilçeleri bağlamalı mıyım?
Evet. İller ve ilçeler veritabanında tutulacaksa bir ilişkisel veritabanınız olmalı.
Tek bir tabloda yapabileceğiniz gibi, doğru olanı birkaç tabloda yapmanızdır.
Evet, illerle ilçeler arasında bir ilişki kurmak, veritabanınızı tasarlarken mantıklı bir yaklaşım olacaktır. Bu şekilde, her ilin birçok ilçesi olabilir ve her ilçe bir il ile ilişkilendirilmiş olur.
Öncelikle, bir veritabanı tasarımı için iki tabloya ihtiyacınız olacak: iller ve ilceler.
İşte bu tabloların örnek bir şeması:
iller
| id | name |
| ----------- | ----------- |
| 1 | İstanbul |
| 2 | Ankara |
| 3 | İzmir |
| 4 | Manisa |
| ... | ... |
ilceler
| id | il_id | name |
| ----------- | ------- | ----------- |
| 1 | 1 | Beyoğlu |
| 2 | 1 | Kadıköy |
| 3 | 1 | Üsküdar |
| 4 | 2 | Çankaya |
| 5 | 2 | Keçiören |
| ... | ... | ... |
Eğer her ilçe için yalnız bir resim / harita / yorum kaydı tutulacaksa, bu veriler de ilceler tablosunda tutulabilir.
Ama her bir ilçe için birden çok kayıt tutulabilecekse, bunlar için de ayrı bir tablo gerekir:
bilgiler
| id | ilce_id | yorum | gorsel |
| ----------- | --------- | -------------------------- | ------------------------------------ |
| 1 | 1 | Beyoğlu 1. yorum metni | Beyoğlu 1. yorum için görsel link'i |
| 2 | 1 | Beyoğlu 2. yorum metni | Beyoğlu 2. yorum için görsel link'i |
| 3 | 2 | Kadıköy 1. yorum metni | Kadıköy 1. yorum için görsel link'i |
| 4 | 2 | Kadıköy 2. yorum metni | Kadıköy 2. yorum için görsel link'i |
| 5 | 3 | Üsküdar 1. yorum metni | Üsküdar 1. yorum için görsel link'i |
| ... | ... | ... | ... |
Diyelim ki bir ilçenin bir resmi, bir konum bilgisi vardır. Ama birçok yorumu vardır.
O zaman ilceler tablosunda gorsel ve konum sütunları olur. bilgiler tablosunda yorum sütunu olur.
Eğer resimler ve yorumlar birbirinden bağımsızsa, yani her ilçenin bir çok görseli olabilirse ve bu görseller yoruma bağlı değilse, görseller için ayrı bir tablo yapmak da gerekebilir.
Düzeltme: markdown olarak tablo olarak oluşturdum ama cevap ekranında tablo oluşmuyor. Bu koduna @tayfunerbilen 'den geliştirme gerekiyor.
Soruyu pek anlamadım. Anladığım kadarıyla aşağıdaki örnek üzerinde sorunu daha açık yazar mısın?
Başlangıçta form şu şekilde:
<form id="addProduct">
<div id="addOption">
<buton>Yeni Opsiyon Ekle</buton>
</div>
</form>
Sonra "Yeni Opsiyon Ekle" yazan butona basıldığında:
1) Javascript ile bir ajax isteği atılıyor. (form submit edilmiyor. Sayfa yenilenmiyor.)
2) Ajax yanıtı olarak gelen verilerle içerikleri doldurulmuş şekilde, div.variantAddContent elementi javascript ile oluşturuluyor.
3) Oluşturulan div.variantAddContent elementi, "Yeni Opsiyon Ekle" yazan butonun hemen sonrasına gelecek şekilde DOM'a basılıyor.
Sonuç olarak:
<form id="addProduct">
<div id="addOption">
<buton>Yeni Opsiyon Ekle</buton>
<div class="variantAddContent gridAutoFlow" id="optionId-0">
<div class="flexColumnLeftGap10">
<label>Name</label>
<input class="input_style" type="text" name="variantAddName[0][optionName]">
</div>
<div class="flexColumnLeftGap10">
<label>Seçenek görünümü</label>
<select name="variantAddName[0][variantType]">
<option>Radyo düğmesi</option>
<option>Açılır menü</option>
<option>Renk</option>
<option>Kutu</option>
</select>
</div>
<div class="flexRow">
<div class="varyantOptionAddListParent">
<div id="varyantOptionAddList" class="flexRow">
<label>Değerler</label>
<div class="flexCenter10 variantAddRow optionListContent" id="optionValId-0">
<input class="input_style" type="text" name="variantAddName[0][optionValue][0]">
<input type="radio" id="defaultOpt0" name="variantAddName[0][optionType]" value="0" class="radioStyle">
<label for="defaultOpt0">Default</label>
<div class="varinatOptionRemove"><i class="fa-solid fa-circle-minus"></i></div>
</div>
<div class="flexCenter10 variantAddRow optionListContent" id="optionValId-1">
<input class="input_style" type="text" name="variantAddName[0][optionValue][1]">
<input type="radio" id="defaultOpt1" name="variantAddName[0][optionType]" value="1" class="radioStyle">
<label for="defaultOpt1">Default</label>
<div class="varinatOptionRemove"><i class="fa-solid fa-circle-minus"></i></div>
</div>
</div>
<div class="addVaryantOPtion" data-optionid="0">+ Yeni değer ekle</div>
</div>
</div>
</div>
<buton>Opsiyonu ekle</buton>
</div>
</form>
Burada "Opsiyonu ekle" butonuna basıldığında form
'un submit edilmesini isteniyorsa butona (button
yerine buton
yazım hatası var) type=submit attribute'si eklenmeli:
<buton>Opsiyonu ekle</buton>
yerine
<button type=submit>Opsiyonu ekle</button>
Böylece buradaki değerler PHP'ye
1) form'da method attribute'si olmadığı için varsayılan "POST" metoduyla
2) action attribute'si olmadığı için aynı sayfayı yenileyerek
iletilir ve sayfanın üstünde bu veriler şöyle yakalanabilir:
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$variantAddName = $_POST['variantAddName'];
$optionName = $variantAddName[0]['optionName'];
$variantType = $variantAddName[0]['variantType'];
$optionValue0 = $variantAddName[0]['optionValue'][0];
$optionType = $variantAddName[0]['optionType'];
// bu verilerle yapılacak işlemler...
}
?>
1) Nesne yapısına hakim değilim. Php'de "$data" dan sonra kullanılan yapıyı bilmiyorum. Prosedür "mysqli_query" tarzında yazabilirseniz ilerleyebilirim.
Veritabanından size nasıl bir sonuç dönüyor bilemiyorum. Örnek vererek ilerleyebilirim:
$sorgu = "SELECT ekle_ad, ekle_ozellik FROM tablom";
$sonuc = mysqli_query($sorgu);
if (!$sonuc) die("Sorgu çalıştırma hatası: " . mysqli_error());
$datas = [];
while ($row = mysql_fetch_assoc($sonuc)) $datas[] = $row;
Aldığınız veriyi, benim örnek verdiğim $datas
değişkenine bu şekilde doldurabilirsiniz.
Böylece $datas
değişkeniniz şöyle bir değer almış olacak:
$datas = [
["ekle_ad" => "yazilimyolcusu", "ekle_ozellik" => "Veri 1"],
["ekle_ad" => "yazilimyolcusu", "ekle_ozellik" => "Veri 3"]
];
Bu bir object'ler array'i. Object'lerin aslında array'den pek farkı yok.
Array'lerde index no ile seçim yaparsınız. Object'lerde ise key'lerle seçim yaparsınız.
Örn. $datas
dizisindeki ilk elemanı almak için: $datas[0]
Örn ilk elemandaki "ekle_ad" key'inin değerini almak için: $datas[0]->ekle_ad
2) Bir sorum olacak. Bu "checkbox_attr" değişkenlerini input'un içinde bu şekilde mi kullanacağız?
Evet. Amacınız, seçili checkbox'a checked özelliği eklemek. Bunu nasıl yapacağınız size kalmış. Benim gösterdiğim bir yol sadece.
Ana dizindeki htaccess dosyasına şu ekleme yapılabilir:
RewriteEngine On
RewriteBase /
# /panel/user isteğini /panel/index.php'ye yönlendir
RewriteRule ^panel/user$ panel/index.php [L]