problema su query con nome tabella variabile

Fabrizio!

Nuovo Utente
31 Gen 2015
15
0
1
Ciao a tutti, ho difficoltà a far funzionare questo codice PHP:
Scritto così non funziona.
Premetto che echo della variabile $GLOBALS['tabella'] restituisce correttamente "computer"

PHP:
require_once("blocks/config.php");
class ajax_table {
..................
function delete_record($id){
	  if($id){
		$tab = $GLOBALS['tabella'];
		mysql_query("delete from $tab where id = $id limit 1");
		return mysql_affected_rows();
	 }
}
..................

se invece lo scrivo così funziona...

PHP:
require_once("blocks/config.php");
class ajax_table {
..................
function delete_record($id){
	  if($id){
		$tab = "computer";
		mysql_query("delete from $tab where id = $id limit 1");
		return mysql_affected_rows();
	 }
}
..................

grazie in anticipo....
 
Ciao, le funzioni non riescono a vedere variabili esterne a se stesse. Puoi paasargliela come parametro oppure provare con global
PHP:
function delete_record($id){
      global $GLOBALS['tabella'];
      if($id){
        $tab = $GLOBALS['tabella'];
        mysql_query("delete from $tab where id = $id limit 1");
        return mysql_affected_rows();
     }
}
 
Ciao Criric, ho provato il tuo suggerimento... purtroppo niente da fare.
Sicuramente, visti i miei limiti, non sono stato molto chiaro.. non credo sia un problema di visibilità all'interno della funzione.
$GLOBALS['tabella'] è una variabile superglobal passata da un'altra pagina PHP... e se faccio un echo all'interno della funzione, restituisce il nome della tabella (che può variare a seconda dei casi) corretto.
 
Ok ho provato e l'echo funziona. spiega meglio cosa non funziona. Ti restituisce qualche errore ?
Hai provato a stampare gli eventuali errori SQL ?
PHP:
if (!mysql_query("delete from $tab where id = $id limit 1")) {
            echo "errore sql " . $query . "<br/>" . mysql_error();
        }
 
Non funziona l'esecuzione della query.. però effettivamente potrebbe essere un problema js, anche perché l'errore "Unexpected error, Please try again" sembrerebbe un box di dialogo js.
Comunque ti spiego il contesto: ho una pagina php contenente una tabella jquery che visualizza i record estrapolati da db mysql.
I record sono estrapolati da tabelle del db il cui nome è una variabile ( $GLOBALS['tabella'] ) passata da un form di un'altra pagina. Nella tabella si possono aggiungere, modificare o cancellare record attraverso pulsanti dedicati o con doppio clic del mouse.
Il tutto sembrerebbe gestito da questi file:

file 1 ajax_table.class.php
PHP:
<?php

require_once("blocks/config.php");

class ajax_table {
   
  public function __construct(){
	$this->dbconnect();
  }
   
  private function dbconnect() {
    $conn = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD)
      or die ("<div style='color:red;'><h3>Could not connect to MySQL server</h3></div>");
         
    mysql_select_db(DB_DB,$conn)
      or die ("<div style='color:red;'><h3>Could not select the indicated database</h3></div>");
     
    return $conn;
  }
   
  function getRecords(){
        echo $GLOBALS['tabella'];
	$this->res = mysql_query($GLOBALS['crea_query']);
	if(mysql_num_rows($this->res)){
		while($this->row = mysql_fetch_assoc($this->res)){
			$record = array_map('stripslashes', $this->row);
			$this->records[] = $record; 
		}
		return $this->records;
	}
	//else echo "Records non Trovato";
  }	

  function save($data){
	if(count($data)){
		$values = implode("','", array_values($data));
		$tab = $GLOBALS['tabella'];
		mysql_query("insert into $tab (".implode(",",array_keys($data)).") values ('".$values."')");
		
		if(mysql_insert_id()) return mysql_insert_id();
		return 0;
	}
	else return 0;	
  }	

  function delete_record($id){
	  if($id){
		global $GLOBALS['tabella'];
		$tab = $GLOBALS['tabella'];
		mysql_query("delete from $tab where id = $id limit 1");
		return mysql_affected_rows();
	 }
  }	

  function update_record($data){
	if(count($data)){
		$id = $data['rid'];
		unset($data['rid']);
		$values = implode("','", array_values($data));
		$str = "";
		foreach($data as $key=>$val){
			$str .= $key."='".$val."',";
		}
		$str = substr($str,0,-1);
		$tab = $GLOBALS['tabella'];
		$sql = "update $tab set $str where id = $id limit 1";

		$res = mysql_query($sql);
		
		if(mysql_affected_rows()) return $id;
		return 0;
	}
	else return 0;	
  }	

  function update_column($data){
	if(count($data)){
		$id = $data['rid'];
		unset($data['rid']);
		$tab = $GLOBALS['tabella'];
		$sql = "update $tab set ".key($data)."='".$data[key($data)]."' where id = $id limit 1";
		$res = mysql_query($sql);
		if(mysql_affected_rows()) return $id;
		return 0;
		
	}	
  }

  function error($act){
	 return json_encode(array("success" => "0","action" => $act));
  }

}
?>

file 2 ajax.php

PHP:
<?
	require_once("ajax_table.class.php");
	$obj = new ajax_table();

	if(isset($_POST) && count($_POST)){
		
		// whats the action ??

		$action = $_POST['action'];
		unset($_POST['action']);

		if($action == "save"){		
			// remove 'action' key from array, we no longer need it

			// Never ever believe on end user, he could be a evil minded
			$escapedPost = array_map('mysql_real_escape_string', $_POST);
			$escapedPost = array_map('htmlentities', $escapedPost);
				
			$res = $obj->save($escapedPost);
			
			if($res){
				$escapedPost["success"] = "1";
				$escapedPost["id"] = $res;
				echo json_encode($escapedPost);
			}
			else
				echo $obj->error("save");
		}else if($action == "del"){
			$id = $_POST['rid'];
			$res = $obj->delete_record($id);
			if($res)
				echo json_encode(array("success" => "1","id" => $id));	
			else
				echo $obj->error("delete");
		}
		else if($action == "update"){
			
			$escapedPost = array_map('mysql_real_escape_string', $_POST);
			$escapedPost = array_map('htmlentities', $escapedPost);

			$id = $obj->update_record($escapedPost);
			if($id)
				echo json_encode(array_merge(array("success" => "1","id" => $id),$escapedPost));	
			else
				echo $obj->error("update");
		}
		else if($action == "updatetd"){
			
			$escapedPost = array_map('mysql_real_escape_string', $_POST);
			$escapedPost = array_map('htmlentities', $escapedPost);

			$id = $obj->update_column($escapedPost);
			if($id)
				echo json_encode(array_merge(array("success" => "1","id" => $id),$escapedPost));	
			else
				echo $obj->error("updatetd");
		}
	}
?>

file 3 script.js

Codice:
// init variables
var trcopy;
var editing = 0;
var tdediting = 0;
var editingtrid = 0;
var editingtdcol = 0;
var inputs = ':checked,:selected,:text,textarea';

$(document).ready(function(){

	// set images for edit and delete 
	$(".eimage").attr("src",editImage);
	$(".dimage").attr("src",deleteImage);
	
	// init table
	blankrow = '<tr valign="top" class="inputform"><td><a href="javascript:;" class="'+savebutton+'"><img src="'+saveImage+'"></a></td><td></td>';
	for(i=0;i<columns.length;i++){
		// Create input element as per the definition
		input = createInput(i,"");
		blankrow += '<td class="ajaxReq">'+input+'</td>';
	}
	blankrow += '</tr>';

	// append blank row at the end of table
	$("."+table).append(blankrow);
	
	// Delete record
	$(document).on("click","."+deletebutton,function(){
		var id = $(this).attr("id");
		if(id){
			if(confirm("Vuoi davvero eliminare il Record ?"))
				ajax("rid="+id,"del");
		}
	});

	// Add new record
	$("."+savebutton).on("click",function(){
		var validation = 1;

		var $inputs =
		$(document).find("."+table).find(inputs).filter(function() {
			// check if input element is blank ??
			if($.trim( this.value ) == ""){
				$(this).addClass("error");
				validation = 0;
			}else{
				$(this).addClass("success");
			}
			return $.trim( this.value );
		});

		var array = $inputs.map(function(){
			return this.value;
		}).get();
		
		var serialized = $inputs.serialize();
		if(validation == 1){
			ajax(serialized,"save");
		}
	});

	// Add new record
	$(document).on("click","."+editbutton,function(){
		var id = $(this).attr("id");
		if(id && editing == 0 && tdediting == 0){
			// hide editing row, for the time being
			$("."+table+" tr:last-child").fadeOut("fast");
						
			var html;
			html += '<td><a href="javascript:;" id="'+id+'" class="'+updatebutton+'"><img src="'+updateImage+'"></a> <a href="javascript:;" id="'+id+'" class="'+cancelbutton+'"><img src="'+cancelImage+'"></a></td> <td></td>';
			for(i=0;i<columns.length;i++){
				// fetch value inside the TD and place as VALUE in input field
				var val = $(document).find("."+table+" tr[id="+id+"] td[class='"+columns[i]+"']").html();
				input = createInput(i,val);
				html +='<td>'+input+'</td>';
			}
			html += "<td>"+$("."+table+" tr[id="+id+"] td:first-child").html()+"</td>";
			
			// Before replacing the TR contents, make a copy so when user clicks on 
			trcopy = $("."+table+" tr[id="+id+"]").html();
			$("."+table+" tr[id="+id+"]").html(html);	
			
			// set editing flag
			editing = 1;
		}
	});

	$(document).on("click","."+cancelbutton,function(){
		var id = $(this).attr("id");
		$("."+table+" tr[id='"+id+"']").html(trcopy);
		$("."+table+" tr:last-child").fadeIn("fast");
		editing = 0;
	});

	$(document).on("click","."+updatebutton,function(){
		id = $(this).attr("id");
		var $inputs =
		$(document).find("."+table).find(inputs).filter(function() {
			return $.trim( this.value );
		});

		var array = $inputs.map(function(){
			return this.value;
		}).get();
		serialized = $inputs.serialize();
		ajax(serialized+"&rid="+id,"update");
		// clear editing flag
		editing = 0;
	});

	// td doubleclick event
	$(document).on("dblclick","."+table+" td",function(e){
		// check if any other TD is in editing mode ? If so then dont show editing box
		//alert(tdediting+"==="+editing);
		var isEditingform = $(this).closest("tr").attr("class");
		if(tdediting == 0 && editing == 0 && isEditingform != "inputform"){
			editingtrid = $(this).closest('tr').attr("id");
			editingtdcol = $(this).attr("class");
			var text = $(this).html();
			var tr = $(this).parent();
			var tbody = tr.parent();
			for (var i = 0; i < tr.children().length; i++) {
				if (tr.children().get(i) == this) {
					var column = i-1;
					break;
				}
			}
			
			// decrement column value by one to avoid sr no column
			column--; 
			//alert(column+"==="+placeholder[column]);
			if(column <= columns.length){
				var text = $(this).html();
				//alert(text);
				input = createInput(column,text);
				$(this).html(input);
				$(this).find(inputs).focus();
				tdediting = 1;
			}
		}
	});
	
	// td lost focus event
	
	$(document).on("blur","."+table+" td",function(e){
		if(tdediting == 1){
			var newval = $("."+table+" tr[id='"+editingtrid+"'] td[class='"+editingtdcol+"']").find(inputs).val();
			ajax(editingtdcol+"="+newval+"&rid="+editingtrid,"updatetd");
		}
	});
	
});

createInput = function(i,str){
	str = typeof str !== 'undefined' ? str : null;
	if(inputType[i] == "text"){
		input = '<input type='+inputType[i]+' name='+columns[i]+' placeholder="'+placeholder[i]+'" value='+str+' >';
	}else if(inputType[i] == "textarea"){
		input = '<textarea name='+columns[i]+' placeholder="'+placeholder[i]+'">'+str+'</textarea>';
	}
	return input;
}

ajax = function (params,action){
	$.ajax({
		type: "POST", 
		url: "ajax.php", 
		data : params+"&action="+action,
		dataType: "json",
		success: function(response){
		  switch(action){
			case "save":
				var seclastRow = $("."+table+" tr").length;
				if(response.success == 1){
					var html = "";
					
					html += '<td><a href="javascript:;" id="'+response["id"]+'" class="ajaxEdit"><img src="'+editImage+'"></a> <a href="javascript:;" id="'+response["id"]+'" class="'+deletebutton+'"><img src="'+deleteImage+'"></a></td>';
					html += "<td>"+parseInt(seclastRow - 1)+"</td>";
					for(i=0;i<columns.length;i++){
						html +='<td class="'+columns[i]+'">'+response[columns[i]]+'</td>';
					}
										
					// Append new row as a second last row of a table
					$("."+table+" tr").last().before('<tr id="'+response.id+'">'+html+'</tr>');
					
					if(effect == "slide"){
						// Little hack to animate TR element smoothly, wrap it in div and replace then again replace with td and tr's ;)
						$("."+table+" tr:nth-child("+seclastRow+")").find('td')
						 .wrapInner('<div style="display: none;" />')
						 .parent()
						 .find('td > div')
						 .slideDown(700, function(){
							  var $set = $(this);
							  $set.replaceWith($set.contents());
						});
					}
					else if(effect == "flash"){
					   $("."+table+" tr:nth-child("+seclastRow+")").effect("highlight",{color: '#6B9E6B'},100);
					}else
					   $("."+table+" tr:nth-child("+seclastRow+")").effect("highlight",{color: '#6B9E6B'},1000);

					// Blank input fields
					$(document).find("."+table).find(inputs).filter(function() {
						// check if input element is blank ??
						this.value = "";
						$(this).removeClass("success").removeClass("error");
					});
				}
			break;
			case "del":
				var seclastRow = $("."+table+" tr").length;
				if(response.success == 1){
					$("."+table+" tr[id='"+response.id+"']").effect("highlight",{color: '#f4667b'},500,function(){
						$("."+table+" tr[id='"+response.id+"']").remove();
					});
				}
			break;
			case "update":
				$("."+cancelbutton).trigger("click");
				for(i=0;i<columns.length;i++){
					$("tr[id='"+response.id+"'] td[class='"+columns[i]+"']").html(response[columns[i]]);
				}
			break;
			case "updatetd":
				//$("."+cancelbutton).trigger("click");
				var newval = $("."+table+" tr[id='"+editingtrid+"'] td[class='"+editingtdcol+"']").find(inputs).val();
				
				//alert($("."+table+" tr[id='"+editingtrid+"'] td[class='"+editingtdcol+"']").html());
				$("."+table+" tr[id='"+editingtrid+"'] td[class='"+editingtdcol+"']").html(newval);

				//$("."+table+" tr[id='"+editingtrid+"'] td[class='"+editingtdcol+"']").html(newval);
				// remove editing flag
				tdediting = 0;
				$("."+table+" tr[id='"+editingtrid+"'] td[class='"+editingtdcol+"']").effect("highlight",{color: '#6B9E6B'},1000);
			break;
		  }
		},
		error: function(){
			alert("Unexpected error, Please try again");
		}
	});
}

Spero di essere stato abbastanza chiaro.
 
togli questo
PHP:
global $GLOBALS['tabella'];
ho sbagliato a fartelo inserire e prova a stampare gli errori SQL come ti ho indicato
 
togli questo
PHP:
global $GLOBALS['tabella'];
ho sbagliato a fartelo inserire e prova a stampare gli errori SQL come ti ho indicato

Scusa, ho sbagliato io a postarlo ... ho già provato senza. Ma niente.
Errori SQL non vengono visualizzati perché sulla conferma di cancellazione del record (alert su script.js), appare subito il messaggio che ho indicato prima.
Però.. dato che, lo stesso codice con:
PHP:
mysql_query("delete from computer where id = $id limit 1");
Funziona....
Mentre, nonostante l'echo di $tab sia "computer", con:
PHP:
$tab = $GLOBALS['tabella']; 
mysql_query("delete from $tab where id = $id limit 1");
Non funziona.... presumo che l'errore sia da altre parti.
 
stampa il response della chiamata ajax e vedi cosa dice
Codice:
success: function(response){
                  alert(response);
 
stampa il response della chiamata ajax e vedi cosa dice
Codice:
success: function(response){
                  alert(response);


nessun messaggio di errore.. altro dettaglio è questo:
temporaneamente il record viene cancellato dalla tabella a video.. ma non dal db.. e ricaricando la pagina riappare conseguentemente anche a video.
Abbastanza snervante..
 
Scusa se ti rispondo solo ora... ma il lavoro non mi ha dato tregua.
Ho rivisto con calma il codice. L'alert è questo..

[object Object]
impedisci a questa pagina di aprire ulteriori finestre di dialogo
 
Giusto il response è di tipo json
scrivi al posto dell'alert
Codice:
console.log(response);
nella console di chrome o di firefox dovrebbe mostrarti il risultato della chiamata ajax
controlla che non ci siano errori li
 
In alternativa chiama da browser direttamente la pagina ajax.php passandole i parametri che servono per la cancellazione, metti l'echo della query e degli errori sql come ti avevo postato e vedi cosa ti dice
 
Prova richiamando la pagina php, la query va in errore per qualche motivo e devi scoprire il perchè
 
Hai messo gli echo ? cosa ti ha stampato la pagina ?
 
Ciao criric

scusa se non ti ho risposto prima.. sono reduce da una dannata influenza.
Ora mi rimetto al lavoro e ti faccio sapere.
 

Discussioni simili