2017-10-12 3 views
1

J'essaie de faire en sorte qu'une requête de mise à jour fonctionne à l'aide de l'attribut name des zones de sélection d'un formulaire. Tout est transmis à $ _POST et la requête INSERT fonctionne correctement, mais je n'arrive pas à comprendre pourquoi la partie update de mon instruction if ne passe pas dans ma base de données. Tout conseil est fort apprécié.Mettre à jour la requête à l'aide de l'attribut Sélectionner un nom

<?php 

global $wpdb; 

$Call_Number = $_POST['Call_Number']; 
$datas = $_POST['REG']; 
$columns = implode(",",array_keys($datas)); 
$values = implode("','",$datas); 

$result = $wpdb->get_results ("SELECT Call_Number FROM DG_Pro_Coach WHERE Call_Number = '".$Call_Number."'"); 

if (count ($result) > 0) { 
    $row = current ($result); 
    $wpdb->query ("UPDATE DG_Pro_Coach SET ".$columns."='".$values."' WHERE Call_Number = '".$Call_Number."'"); 
} else { 
    $wpdb->query("INSERT INTO DG_Pro_Coach (".$columns.",Call_Number) VALUES ('".$values."','$Call_Number')"); 
} 

?> 
+1

Rien à voir avec la question, mais néanmoins important: S'il vous plaît [paramétrez vos requêtes] (https://stackoverflow.com/questions/332365/how-does-the-sql-injection-from-the-bobby- tables-xkcd-comic-travail)! – waka

+0

votre syntaxe clause de mise à jour est faux, il devrait être comme ça UPDATE t1 SET col1 = val1, col2 = val2 où les conditions, vôtre est UPDATE t1 SET col1, col2 = val1, vla2 où la condition –

Répondre

1

Votre requête de mise à jour a une mauvaise syntaxe car vous incluez les données de vos baies PHP dans un mauvais sens.

Pour les paramètres d'entrée:

$Call_Number = '123456789'; 
$datas = array('one' => 1, 'two' => 2); 

Cette requête est créée:

UPDATE DG_Pro_Coach SET one,two='1','2' WHERE Call_Number = '123456789' 

Solution possible:

$update_array = array(); 
foreach ($datas as $column=>$value) { 
    $update_array[] = "$column = '$value'"; 
} 
$update_string = implode(', ', $update_array); 

$wpdb->query ("UPDATE DG_Pro_Coach SET ".$update_string.' WHERE Call_Number = '".$Call_Number."'"); 
2

Problème

Votre requête devrait ressembler à ceci:

UPDATE database SET column1=value1, column2=value2(...) WHERE condition

Mais il ressemble à ceci:

UPDATE database SET column1,column2(...) = value1,value2(...) WHERE condition

Solution

<?php 

global $wpdb; 

$Call_Number = $_POST['Call_Number']; 
$datas = $_POST['REG']; 
$columns = implode(",",array_keys($datas)); 
$values = implode("','",$datas); 
$updatelist = ""; 
foreach($datas as $key=>$value){ 
    $updatelist .= $key."=".$value.","; 
} 
$updatelist = substr($updatelist,0,strlen($updatelist)-1); 

$result = $wpdb->get_results ("SELECT Call_Number FROM DG_Pro_Coach WHERE Call_Number = '".$Call_Number."'"); 

if (count ($result) > 0) { 
    $row = current ($result); 
    $wpdb->query ("UPDATE DG_Pro_Coach SET ".$updatelist."' WHERE Call_Number = '".$Call_Number."'"); 
} else { 
    $wpdb->query("INSERT INTO DG_Pro_Coach (".$columns.",Call_Number) VALUES ('".$values."','$Call_Number')"); 
} 

?> 
+0

Merci pour l'entrée, logiquement le code prend tout son sens mais lorsque j'essaie d'utiliser les solutions suggérées, la page ne fonctionne plus (erreur 500). J'ai essayé plusieurs façons d'adapter le code mais sans aucune chance. – Nick

+0

Pas d'erreurs, supprimer la requête UPDATE elle-même ne résout pas le problème, donc je suppose qu'il doit être un problème avec le PHP – Nick

+0

@Nick activer la sortie d'erreur php en ajoutant cela à votre code: 'ini_set (" display_errors ", 1) ; 'et' error_reporting (E_ALL); ' –

0

Un grand merci pour toute l'aide, cette est le code de travail.

<?php 

global $wpdb; 

$Call_Number = $_POST['Call_Number']; 
$datas = $_POST['REG']; 
$columns = implode(",",array_keys($datas)); 
$values = implode("','",$datas); 
$updatelist = ""; 
foreach($datas as $key=>$value){ 
$updatelist .= $key."='".$value."', "; 
} 
$updatelist = substr($updatelist,0,strlen($updatelist)-2); 

$result = $wpdb->get_results ("SELECT Call_Number FROM DG_Pro_Coach WHERE Call_Number = '".$Call_Number."'"); 

if (count ($result) > 0) { 
$row = current ($result); 
$wpdb->query ("UPDATE DG_Pro_Coach SET ".$updatelist." WHERE Call_Number = '".$Call_Number."'"); 
} else { 
$wpdb->query("INSERT INTO DG_Pro_Coach (".$columns.",Call_Number) VALUES ('".$values."','$Call_Number')"); 
} 

?>