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....
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
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();
     }
}
 

Fabrizio!

Nuovo Utente
31 Gen 2015
15
0
1
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.
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
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();
        }
 

Fabrizio!

Nuovo Utente
31 Gen 2015
15
0
1
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.
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
togli questo
PHP:
global $GLOBALS['tabella'];
ho sbagliato a fartelo inserire e prova a stampare gli errori SQL come ti ho indicato
 

Fabrizio!

Nuovo Utente
31 Gen 2015
15
0
1
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.
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
stampa il response della chiamata ajax e vedi cosa dice
Codice:
success: function(response){
                  alert(response);
 

Fabrizio!

Nuovo Utente
31 Gen 2015
15
0
1
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..
 

Fabrizio!

Nuovo Utente
31 Gen 2015
15
0
1
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
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
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
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
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
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
Prova richiamando la pagina php, la query va in errore per qualche motivo e devi scoprire il perchè
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
Hai messo gli echo ? cosa ti ha stampato la pagina ?
 

Fabrizio!

Nuovo Utente
31 Gen 2015
15
0
1
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
Autore Titolo Forum Risposte Data
O problema con query PHP 4
L problema con query select PHP 2
R Problema query con ricerca id numerico PHP 2
G Problema ------- con Query PHP 1
G Problema con Query PHP 1
M [PHP] Problema con query select PHP 2
V [MySQL] problema query con date su server MySQL 5
D Problema con query in php PHP 5
M [PHP] Problema con query PHP 17
Rikk73 [C#] problema con stampa da query linq EnumerableRowCollection .NET Framework 0
M Problema con query PHP 15
G Problema con una query. PHP 5
M problema con media query CSS HTML e CSS 1
L problema creazione query con campo float PHP 2
andrea.peo Problema query con join visualizzazione record ripetuti PHP 5
Emix Dubbio e problema su query con operatore LIKE PHP 56
S Problema query con sum MySQL 4
G Problema con query mysql MySQL 1
L PHP: problema con query mysql. PHP 3
S Autocompletamente con jQuery, PHP e MySQL - Problema con le query PHP 7
Trapano Problema con query MySQL 32
K problema con query complessa MySQL 4
K [MYSQL] problema con una query in loop MySQL 1
D problema con ciclo if else query PHP 3
neo996sps Problema con query e script PHP PHP 4
B Problema con query mySql Java 2
P problema con query PHP 0
A problema con query mysql PHP 1
A Problema con Query SQL Classic ASP 3
P problema con una query PHP 0
B problema con query PHP 4
K problema con una query.. Database 2
M Problema su query JOIN in tre tabelle PHP 0
A [PHP] Problema query insert [RISOLTO] PHP 14
T [php] problema creazione query select-where PHP 5
trattorino problema raccapricciante php conteggio query PHP 4
L [PHP] Problema creazione query a numero di parametri variabile PHP 6
G Mysql ( Query) problema interrogazione MySQL 0
E [PHP] problema insert query PHP 9
G problema query mysql in php PHP 5
F PHP problema doppi apici all'interno di una query SQL PHP 1
D Problema caratteri jolle su criterio Query MS Access 0
elpirata Query di ricerca problema campo data italiano PHP 2
X Problema di sostituzione tramite query sql MySQL 5
S Problema Query PHP 2
S Problema query PHP 25
Emix Problema query inserimento... PHP 6
B problema query PHP 6
B problema query mysql php PHP 1
A problema query e javascript Javascript 0

Discussioni simili