Kategoriler
Teknik

MySQL’de “Truncated incorrect DOUBLE value” hatası

Her ne kadar hata içerisinde "DOUBLE value" ibaresi geçse de bu hatayı aldığınızda tablonuzda DOUBLE tipinde bir sütun mevcut olmayabilir. Bu yüzden bir kafa karışıklığı yaratabiliyor. Benim karşılaştığım, VARCHAR türünde bir sütunda INTEGER koşul sorgulama yaptığım sırada hata vermesiydi. Örnek sorguyu paylaşayım:

 update `foo_table` set `foo_type` = 'PC', `foo_table`.`updated_at` = '2022-07-23 12:32:41' where `id` >= 4843051 and `user
_id` = 8081 and `foo_id` = 12 and `foo_type` = 'CT';

Bu sorgudaki problem, foo_id sütunundaki koşulu belirtirken integer olarak koşullandırmamdan kaynaklı. Halbuki bu sütun string türünde veri de tutabilecek türde yani VARCHAR. Bu sebepten dolayı "Truncated incorrect DOUBLE value" hatası aldım. Bunu düzeltmek için foo_id koşulundaki veriyi tırnak içine aldım.

 update `foo_table` set `foo_type` = 'PC', `foo_table`.`updated_at` = '2022-07-23 12:32:41' where `id` >= 4843051 and `user
_id` = 8081 and `foo_id` = '12' and `foo_type` = 'CT';

Ve artık her şey yolunda.

Araştırdığım kadarıyla daha çok UPDATE sorgularında yaşanan bir problem ve MySQL açısından haklı bir serzeniş.

Bu hata ile karşılaşmanıza olası başka bir senaryoda şu şekildeymiş:

update students SET name='Ali' and score=9 where id=1
ERROR 1292 (22007): Truncated incorrect DOUBLE value: 'Ali'

Bu sorgudaki sıkıntı açık, UPDATE yaparken name ve score sütunlarını belirtirken AND ifadesi kullanmak. Normal şartlarda UPDATE sorgusunda güncelleme yapılacak sütunlar tanımlanırken virgül ile ayırılır. Yani:

update students SET name='Ali', score=9 where id=1

Diğer bir çözüm olarak da CAST() fonksiyonu kullanılabilir.

Ek olarak PDO veya Laravel üzerinde Eloquent ORM ile veriyi bind ederken string olarak göndermelisiniz.

Student::where('foo_id', '15')->update([...]);
Student::where('foo_id', '19RDA32')->update([...]);

PDO ile:

$statement = $pdo->prepare('update ...');
$statement->bindParam('foo_id', '15');
// veya
$statement->bindParam('foo_id', '15', \PDO::PARAM_STR);

PDO‘da, bindParam metodunda üçüncü parametre varsayılan olarak \PDO::PARAM_STR olarak tanımlıdır. Bu detayda hatanıza sebep olabilecek durumlardan birisi olabilir.

İyi çalışmalar.

Kategoriler
Teknik

SQL’de Sonraki ve Önceki Satırdaki Veriyi Getirmek

Bir gönderi/blog sistemi düşünelim. Hatta WordPress’ten örnekleyebiliriz. Bazı bloglarda, bir gönderiye girdiğimizde sonraki ve önceki gönderiler için bağlantı olduğunu görürüz. Bunlar için ayrı veriler çekmemiz gerekiyor. Örnek verirken bir model dosyasında kod yazıyormuş gibi örnekleyeceğim, SQL kodundan yola çıkarak sizde geliştirebilirsiniz.

class Post extends Model
{
  public function nextPost($id)
  {
    $sql = 'SELECT * FROM posts WHERE id > ? ORDER BY id ASC LIMIT 1';
    $sth = $this->db->prepare($sql);
    $sth->execute(array($id));
    return $sth->fetch();
  }

  public function prevPost($id)
  {
    $sql = 'SELECT * FROM posts WHERE id < ? ORDER BY id DESC LIMIT 1';
    $sth = $this->db->prepare($sql);
    $sth->execute(array($id));
    return $sth->fetch();
  }
}
Kategoriler
Teknik

SQL’de Gün İçindeki/Bugüne Ait Kayıtları Listelemek

SQL’de gün içindeki kayıtları listelemek için şöyle bir sorgu gerekiyor:

SELECT * FROM kayitlar WHERE DATE(tarih) = CURDATE();

Bu sorgu, o gün içindeki kayıtları listeliyor. Yani bugün ayın 5’i ise, 5’inde girilen kayıtları gösteriyor.

Bir diğer kullanım ise, son bir günlük kayıtları göstermek. Sorguyu inceleyelim:

SELECT * FROM kayitlar WHERE tarih > DATE_SUB(CURDATE(), INTERVAL 1 DAY);

Bu sorguda son bir gün, yani 24 saatlik kayıtları listeliyor. 1 DAY yazan yeri 1 WEEK yaparak bir haftalık kayıtları, 1 MONTH yazarak son bir aylık kayıtları alabiliyoruz.

Ya da alternatif olarak aşağıdaki sorgu işimizi görebilir:

SELECT * FROM kayitlar 
WHERE tarih >= CURDATE()
  AND tarih < CURDATE() + INTERVAL 1 DAY
ORDER BY tarih;