Mysql
 sql >> Base de données >  >> RDS >> Mysql

Vraiment aux prises avec CONCAT_WS ... s'il vous plaît aider un débutant :)

La première chose que je peux voir est votre sprintf() a deux paramètres de substitution mais un seul espace réservé. Je pense que tu voulais vraiment dire

$updateSQL = sprintf ("UPDATE Leads SET Notes = CONCAT_WS('\n', Notes, %s) WHERE Id=%d",
    GetSQLValueString($_POST['note'], "text"),
    GetSQLValueString($_POST['Id'], "int"));

Aussi, votre GetSQLValueString() La fonction enveloppe automatiquement les paramètres "texte" avec des guillemets, vous devez donc supprimer les guillemets autour des espaces réservés.

J'ai également changé l'espace réservé de l'ID en %d car je suppose que vous attendez un nombre.

Vous pouvez bénéficier de l'activation du rapport d'erreurs pour le développement. Cette erreur (et potentiellement une autre concernant le $Notes non défini variable) aurait facilité le débogage.

Placez ceci en haut de votre script (pour le développement uniquement)

ini_set('display_errors', 'On');
error_reporting(E_ALL);

Croisade personnelle

Abandonnez la bibliothèque MySQL et déplacez votre code vers PDO, vous ne regarderez pas en arrière.

$stmt = $db->prepare('UPDATE Leads SET Notes = CONCAT_WS(:sep, Notes, :note) WHERE Id = :id');
$stmt->execute(array(
    'sep'  => PHP_EOL,
    'note' => $_POST['note'],
    'id'   => $_POST['Id']
));

Une meilleure approche

Envisagez de stocker chaque entrée de note dans une table séparée avec une relation de clé étrangère avec le parent "Lead" et l'horodatage de création. De cette façon, vous récupérez simplement toutes les entrées de note enfant dans l'ordre de création et les nouvelles entrées sont simplement insérées.

CREATE TABLE LeadNotes (
    id         INT NOT NULL AUTO_INCREMENT,
    lead_id    INT,
    note       TEXT,
    created_dt TIMESTAMP,
    PRIMARY KEY (id),
    FOREIGN KEY (lead_id) REFERENCES Leads (Id)
        ON DELETE CASCADE
) ENGINE=INNODB;