önce masraflarını çıkart. bundan yola çıkarak saatlik ücretini çıkart. Ve projenin ne kadar süreceğini belirle. Fiyat ortaya çıkar.
Saatlik ücretini çıkarırken herşeyi göz önünde bulundur.
Düzeltme için teşekkürler.
Gördüğüm kadarıyla PHP 8.1 için 2 satırda değişiklik var.
Yazdığınız kodu PHP 7 ve üzeri sürümlerde kullanım sağlayamaz mıyım?
Yani illa ki aşağıdaki satırlar için PHP 8.1 ve üzeri sürüm mü gerekiyor?
// Değişiklik: ENT_HTML5 flag'i eklendi
$output = htmlentities($input, ENT_QUOTES | ENT_HTML5);
// Değişiklik: strlen yerine mb_strlen kullanıldı
if (mb_strlen($query_string) > 255 || stripos($query_string, $pattern) !== false) {
Bu kısım Ajaxtan gelen verileri aldığımız PHP dosyası. $csrf_token, $recaptcha Göndermeyi unutmayın.
Bunun bir gelişmişi vardı. Bulamadım. Orada şöyle bir işlem daha yapmıştım. Ajax query alan adından mı geliyor? veya bu alan adından gelmeyen ajax isteklerini şuraya yönlendir gibi özellikler vardı. Sende buna göre düzenleyebilirsin.
function isAjaxRequest(){
return !empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest';
}
$errors = [];
$data = [];
if (isAjaxRequest()){
if(isset($_POST) & !empty($_POST)){
$postAdi = strip_tags($_POST["postAdi"]);
if(empty($recaptcha)){
$data['status'] = 'error';
$errors['recaptcha'] = 'Please check the the captcha form.';
$data['errors'] = $errors;
}else{
// CSRF Token Validation
if(isset($csrf_token)){
if($csrf_token === $_SESSION['csrf_token']){
// CSRF Token Time Validation
$max_time = 60*60*24; // in seconds
if(isset($_SESSION['csrf_token_time'])){
$token_time = $_SESSION['csrf_token_time'];
if(($token_time + $max_time) >= time() ){
// Tüm hataları burada kontrol edebilirsin.
if (empty($postAdi)) {
$errors['hataAdi'] = 'Hata açıklaması bu alanda olmalı.';
}
// eğer $errors değişkeni boş değilse hatalar geri dönecek.
if (!empty($errors)) {
$data['status'] = 'error';
$data['errors'] = $errors;
} else {
// $errors değişkeni boşsa işlemler burada başlayacak.
// veritabanı vs işlemleri
$data['status'] = 'success';
$data['message']= 'işleminiz başarıyla gerçekleşti.';
}
}else{
$errors['csrfExpired'] = 'CSRF token hatası. Sayfayı yenileyin!';
$data['status'] = 'error';
$data['errors'] = $errors;
unset($_SESSION['csrf_token']);
unset($_SESSION['csrf_token_time']);
}
}else{
$errors['csrfTime'] = 'CSRF token süresi dolmuştur. Lütfen sayfayı yenileyin!';
$data['status'] = 'error';
$data['errors'] = $errors;
}
}else{
$errors['csrfValidate'] = 'CSRF Token doğrulama hatası. Lütfen sayfayı yenileyin!';
$data['status'] = 'error';
$data['errors'] = $errors;
}
}else{
$errors['csrfToken'] = 'CSRF Token bulunamadı. Lütfen sayfayı yenileyin!';
$data['status'] = 'error';
$data['errors'] = $errors;
}
}
}else {
$errors['realuser'] = "İstek yöntemi POST değil veya Sayfaya gönderilen POST mevcut değil!";
$data['status'] = 'error';
$data['errors'] = $errors;
}
} else {
$errors['pageError'] = "Kullanılabilir istek yok veya Gelen istek Ajax değerinde değil!";
$data['status'] = 'error';
$data['errors'] = $errors;
}
echo json_encode($data);
.on ile kullanırsan daha sağlıklı olur.
$(document).on('click', '.butonClassAdi', function(){
// dosomething'
});
Sorunu çözdüm. BasicDB kullanan arkadaşlar Join kullandığınızda 2 tabloda da aynı kolon adı varsa aşağıdaki gibi kullanabilirsiniz.
$Query = $db->from('tabloadi AS t')
->select('t.userid, t.pid, t.symbol, t.amount, t.tokenaddress, t.status, t.timedate, u.uid, u.users, u.email')
->join('users AS u', 'u.uid = t.userid')
->where('id', $searchValue, 'LIKE')
->orderby($columnName, $columnSortOrder)
->limit($row, $rowperpage)
->all();
sayfaları hazırladığını varsayarak şöyle bir kod yardımıyla yapabilirsin.
$('.row').on("click",".nav_link",function(e){
e.preventDefault(); // cancel click
var page = $(this).attr('href');
$('.row').load(page);
});
Ajax tarafında sana bir data diye alan bırakmıştım. Şöyle yapabilirsin. Basitçe anlatıyorum. Geliştirmesi sana kalmış :)
JS Tarafında Ajax altında data diye bir alan var. O alana istediğin parametreleri yazıyorsun. Örneğin page diye bir parametre gönderdim ben. PHP tarafını kontrol et detayı orada anlatacağım.
$('#transactionAjaxTable').DataTable({
'processing': true,
'serverSide': true,
'serverMethod': 'post',
'ajax': {
'url':'api-datatables.php',
'data': {
page: 'swap'
}
},
'columns': [
{ data: 'username' },
{ data: 'pid' },
{ data: 'fromTo' },
{ data: 'fromToAmount' },
{ data: 'fromToPrice' },
{ data: 'processTime' },
{ data: 'action' }
]
});
Php tarafında ise page parametresini $_POST yada $_GET hangisini kullanıyorsan onunla çekiyorsun. Böylece veritabanınıda sorgulama yaparken tablo adını veya kolon adı hangilerini istiyorsan ona göre parametreleri gönderip sorgulama yapabilirsin. Aşağıda örneğini oluşturdum.
<?php
include 'layouts/session.php';
// Datatables Ajax Data parameter
$page = $_POST['page'];
if($page == 'users') {
// Kodlar bu alana gelecek.
}
teşekkürler. Önemli bir bilgi.
işini görür mü bilmiyorum. Ama 1 hafta kadar önce şöyle bir çalışma yaptım. incelemeni tavsiye ederim.
Sıralamayı falan hep api-datatables.php tarafında halledebilir ve direkt bilgiyi ekrana basabilirsin.
api-datatables.php
<?php
include 'layouts/session.php';
// Reading value
$draw = $_POST['draw'];
$row = $_POST['start'];
$rowperpage = $_POST['length']; // Rows display per page
$columnIndex = $_POST['order'][0]['column']; // Column index
$columnName = $_POST['columns'][$columnIndex]['data']; // Column name
$columnSortOrder = $_POST['order'][0]['dir']; // asc or desc
$searchValue = $_POST['search']['value']; // Search value
$count = 1;
$searchArray = array();
$searchQuery = " ";
if($searchValue != ''){
$db->from('transactions')
->join('users', '%s.uid = %s.uid')
->where('pid', $searchValue, 'LIKE')
->or_where('users', $searchValue, 'LIKE')
->or_where('dtime', $searchValue, 'LIKE')
->all();
}
// Total number of records without filtering
$totalRecords = $db->from('transactions')->select('count(*) as total')->total();
// Total number of records with filtering
$totalRecordwithFilter = $db->from('transactions')->select('count(*) as total')
->join('users', '%s.uid = %s.uid')
->where('pid', $searchValue, 'LIKE')
->or_where('users', $searchValue, 'LIKE')->total();
// Fetch records
$empRecords = $db->from('transactions')
->join('users', '%s.uid = %s.uid')
->where('pid', $searchValue, 'LIKE')
->or_where('users', $searchValue, 'LIKE')
->orderby($columnName, $columnSortOrder)
->limit($row, $rowperpage)
->all();
$data = array();
foreach ($empRecords as $row) {
$data[] = array(
"username"=>'<a href="users-info.php?uid='.$row['uid'].'"><span style="font-size:14px;">'.$row['users'].' ('.$row['uid'].')',
"pid"=>$row['pid'],
"fromTo"=>$row['cointype'] .' - '. $row['tocointype'],
"fromToAmount"=>decimalZeroClear(number_format($row['fromamount'], 4, ".", "")) .' - '. decimalZeroClear(number_format($row['toamount'], 4, ".", "")),
"fromToPrice"=>decimalZeroClear(number_format($row['fromcoinprice'], 4, ".", "")) .' - '. decimalZeroClear(number_format($row['tocoinprice'], 4, ".", "")),
"processTime"=>$row['processtime'],
"action"=>' <a href="swap-edit.php?uid='.$row['id'].'" type="button" title="Swap Edit" class="btn btn-sm btn-warning waves-effect waves-light m-1"><i class="far fa-edit"></i></a>
<a href="swap-undo.php?pid='.$row['pid'].'" type="button" title="Swap Undo" class="btn btn-sm btn-danger waves-effect waves-light m-1"><i class="far fa-undo"></i></a>',
);
}
// Response
$response = array(
"draw" => intval($draw),
"iTotalRecords" => $totalRecords,
"iTotalDisplayRecords" => $totalRecordwithFilter,
"aaData" => $data
);
echo json_encode($response);
?>
datatable.js Tarafı
$('#transactionAjaxTable').DataTable({
'processing': true,
'serverSide': true,
'serverMethod': 'post',
'ajax': {
'url':'api-datatables.php',
/*'data': {
page: 'swap'
}*/
},
'columns': [
{ data: 'username' },
{ data: 'pid' },
{ data: 'fromTo' },
{ data: 'fromToAmount' },
{ data: 'fromToPrice' },
{ data: 'processTime' },
{ data: 'action' }
]
});
HTML Tarafı
<table id="withdrawalAjaxTable" class="table table-bordered dt-responsive nowrap w-100">
<thead>
<tr>
<th scope="col">User</th>
<th scope="col">Process ID</th>
<th scope="col">Symbol</th>
<th scope="col">Total Amount</th>
<th scope="col">Time</th>
<th scope="col">walletaddress</th>
<th scope="col">Check</th>
<th scope="col">Action</th>
</tr>
</thead>
</table>
merhaba;
- Scriptine Serial no ekleme. Domain - IP kontrollü bir sistem yapma. İnternette fazlası ile var.
- En önemlisi domain - IP kontrol hazırladığın dosyayı sitenin en önemli .php dosyasına ekleyerek ioncube ile şifreleme
- İyi bir Hosting firması ile çalışabilirsin. Hosting firmasının güncel alt yapı kullandığına dikkat et.
- Etikliği tartışılır ama Scriptinin içine uzaktan kapatabilme özelliği ekleyebilirsin. Çalınsa bile bir domaine kurulurken arka taraftan sana mail gönderebilir. Bilgilendirmek amaçlı.