Aynı cevabı 2 kez göndermişim. Bunu değiştiriyorum.
Bir php dosyası (örn. metatags.php) hazırla. Bu dosya, her sayfan için meta etiketleri verilerini içeren bir array'e sahip olsun. Header dosyana bu dosyayı include et.
URL'i parçalayıp dizi içinden bu sayfaya gelecek meta etiken verilerini bul ve ilgili değişkenleri bu verilerle doldur.
Nasıl bir routing yaptığına göre değişir ama ben basitçe bir örnek yazıyorum:
metatags.php
<?php
$allMetaTags = [
"--default--" => (object)["title"=>"Site Adı", "description"=>"..."], // Bu diziye eklemediğimiz bir sayfa olursa varsayılan olarak göstereceğimiz veriler
"index.php" => (object)["title"=>"Ana Sayfa", "description"=>"..."],
"hakkimizda.php" => (object)["title"=>"Hakkımızda", "description"=>"..."],
"iletisim.php" => (object)["title"=>"İletişim", "description"=>"..."],
"listeleme/index.php" => (object)["title"=>"Ürün Listesi", "description"=>"..."],
//...
];
// Bazı key'leri birbirine bağlamamız gerekebilir.
$allMetaTags[""] = &$allMetaTags["index.php"]; // "https://siteadi.com/index.php" ile "https://siteadi.com" istekleri aynı sayfayı işaret eder.
$allMetaTags["listeleme"] = &$allMetaTags["listeleme/index.php"]; // "https://siteadi.com/listeleme/index.php" ile "https://siteadi.com/listeleme" istekleri aynı sayfayı işaret eder.
$allMetaTags["listeleme/detaylar.php"] = &$allMetaTags["listeleme/index.php"]; // Kafamıza göre bazı sayfaların başka sayfalarla aynı meta verilerine sahip olmasını da isteyebiliriz.
header.php
<?php
require_once("metatags.php");
$urlParts = parse_url($_SERVER['REQUEST_URI']); // Örneğin "https://siteadi.com/hakkimizda.php" gibi bir url'yi parçaladık.
$fileName = trim($urlParts['path'], '/'); // "https://siteadi.com/hakkimizda.php" gibi bir url için dosya adını ("hakkimizda.php") almış olacağız.
$metaTags = array_key_exists($fileName, $allMetaTags) ? $allMetaTags[$fileName] : $allMetaTags['--default--']; // Dosya adını dizimizin key'lerinde bulabilirsek onun verilerini kullanacağız. Bulamazsak "--default--" key'indeki verileri kullanacağız.
?>
<head>
<title><?= $metaTags->title ?></title>
<meta name="description" content="<?= $metaTags->description ?>">
</head>
Not: Kodları test etmedim. Yazım yanlışlarım olabilir.
"@apollo/[email protected]" paketi "graphql@^16.8.1" sürümünü istiyor,
"@apollo/[email protected]" paketi "graphql@^14.3.1" sürümünü istiyor.
"@apollo/[email protected]" paketi "react@^18.2.0" sürümünü istiyor,
"@apollo/[email protected]" paketi "react@^16.8.0" sürümünü istiyor.
"[email protected]" paketi "graphql@^16.8.1" sürümünü istiyor,
"@urql/[email protected]" paketi "graphql@^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0" sürümlerini istiyor.
Bu işi böyle çözemeyeceğiz diye düşünerek projenin repository'sini internette aradım.
Projenin Github sayfasına girince şu uyarıyı gördüm: THIS PROJECT HAS BEEN DEPRECATED
Bu yüzden güncel paketlerle uyum sorunları oluşuyor olabilir.
Proje sonlandırılıp yerine yenisi getirilmiş ve eski paketler yerine şu paketlerin yenileriyle değiştirilmesi önerilmiş:
old: @apollo/react-components --> new: @apollo/client/react/components
old: @apollo/react-hoc --> new: @apollo/client/react/hoc
old: @apollo/react-ssr --> new: @apollo/client/react/ssr
old: @apollo/react-testing --> new: @apollo/client/testing
old: @apollo/react-hooks --> new: @apollo/client
Bu geçişi en düzgün şekilde (projeye en az zarar verecek şekilde) yapabilmek için de yönergeler eklenmiş: https://www.apollographql.com/docs/react/migrating/apollo-client-3-migration/
Bunu uzun uzun inceyemedim. Yapay zekanın sayfayı özetlemesini istedim.
Verdiği çıktıyı direkt aşağıya yapıştırıyorum ama yine de link üzerinden gitmen daha sağlıklı olur.
Apollo Client 3.0'e geçiş yapmak için aşağıdaki adımları izleyebilirsin:
1) Paketleri Yükleme: Yeni paketleri yüklemek için aşağıdaki komutu çalıştır:
npm install @apollo/client
2) Paketleri Kaldırma: Daha önce "apollo-client", "apollo-boost" veya "react-apollo" paketlerini kullandıysan, bunları projenden kaldır:
npm uninstall apollo-client apollo-boost react-apollo
3) İçe Aktarmaları Güncelle: Kodundaki tüm "apollo-client" ve "apollo-boost" içe aktarmalarını "@apollo/client" ile değiştir. Örneğin:
import { useQuery, useMutation } from '@apollo/client';
4) Sunucu Tarafı İşleme (SSR): SSR işlevlerini kullanıyorsan, bunları yeni konumlarından içe aktar:
import { getDataFromTree } from '@apollo/client/react/ssr';
5) Test Etme: Test bileşenlerini kullanıyorsan, bunları yeni konumlarından içe aktar:
import { MockedProvider } from '@apollo/client/testing';
6) Bağlantılar: Bağlantılar artık "@apollo/client" paketinin bir parçasıdır. Bağlantıları içe aktarmak için daha spesifik olman gerekebilir:
import { createHttpLink } from '@apollo/client';
import { createPersistedQueryLink } from '@apollo/client/link/persisted-queries';
7) Otomatik Dönüştürme: Kod tabanın büyükse, Apollo'nun sağladığı otomatik dönüştürme aracını kullanabilirsin:
1- Apollo Client deposunu kopyala:
git clone https://github.com/apollographql/apollo-client.git
2- JSCodeshift aracını kullanarak içe aktarmaları dönüştür:
npx jscodeshift -t apollo-client/codemods/ac2-to-ac3/imports.js --extensions js source-directory
Burada "source-directory", dönüştürmek istediğin dosyaları içeren klasörün yoludur.
8) Diğer Paketler: Diğer paketleri (örneğin "apollo-link", "apollo-cache-inmemory") kullanıyorsan, bunları "@apollo/client" paketine taşıman gerekebilir.
Daha fazla bilgi için Apollo Client belgelerine bakabilirsin.
Ortak özellikleri ve stilleri içeren bir yüksek dereceli bileşen (higher-order component - HOC) oluşturabilirsin.
Input ve PasswordInput bileşenlerini bu bileşene sarabilirsin.
Örneğin:
import React from 'react';
interface InputProps {
value: string;
onChange: (event: React.ChangeEvent<HTMLInputElement>) => void;
style?: React.CSSProperties;
}
const withInputProps = (WrappedComponent: React.ComponentType<InputProps>) => {
const InputWrapper = forwardRef<HTMLInputElement, Omit<InputProps, 'ref'>>((props, ref) => {
const { forwardedRef, ...otherProps } = props;
return <WrappedComponent ref={ref} {...otherProps} />;
});
return forwardRef<HTMLInputElement, Omit<InputProps, 'ref'>>((props, ref) => {
return <InputWrapper {...props} forwardedRef={ref} />;
});
};
export default withInputProps;
Daha sonra Input ve PasswordInput bileşenlerini bu HOC ile sarabilirsin:
import React from 'react';
import withInputProps from './withInputProps';
import BaseInput from './BaseInput';
const Input = withInputProps(BaseInput);
const PasswordInput = withInputProps(BaseInput);
export default { Input, PasswordInput };
Bu yanıtı https://cohere.com yapay zekasından yardım alarak yazım.
yenieklenensayfasi.php sayfasına attığın istek json dönmüyor. Bunun yerine bir html içerik (muhtemelen php hata sayfası) dönüyor.
Bu yüzden .then(response => response.json())
satırında hata alıyorsun.
yenieklenensayfasi.php sayfasının json döndürdüğünden emin olmalısın. Bir hata varsa bunu bulup gidermelisin.
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.