真的与CONCAT_WS挣扎……请帮助新手:)
这里的PHP和MYSQL新手…..现在可以真正使用你的帮助了。 我在我的脚本中实现了一个Submodal,最后让它将“User Notes”提交到数据库中。 不幸的是,每次提交新文件时,提交的文本都会覆盖之前的提交。 我被告知要使用CONCAT_WS来防止这种情况发生……我已经在Dreamweaver上尝试了几个小时来实现这一目标,但它无法正常工作。 这是我的部分代码……
出现此错误的新代码:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'great'') WHERE Id=35' at line 1
码…
<?php if (!function_exists("GetSQLValueString")) { function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") { if (PHP_VERSION
HTML
function clickSubmit() { $("form").submit(); } <form action="" method="POST" name="lead_note_form" id="lead_note_form" target="_top"> <input type="hidden" name="Id" id="Id" value="" /> Add Note:
我能看到的第一件事是你的sprintf()
有两个替换参数,但只有一个占位符。 我在想你的意思
$updateSQL = sprintf ("UPDATE Leads SET Notes = CONCAT_WS('\n', Notes, %s) WHERE Id=%d", GetSQLValueString($_POST['note'], "text"), GetSQLValueString($_POST['Id'], "int"));
此外,您的GetSQLValueString()
函数会自动用引号包装“text”参数,因此您需要删除占位符周围的引号。
我还将ID占位符更改为%d
因为我假设您期待一个数字。
您可以从为开发启用错误报告中受益。 这个错误(可能是另一个关于未定义的$Notes
变量)会使调试更容易。
将它放在脚本的顶部(仅用于开发)
ini_set('display_errors', 'On'); error_reporting(E_ALL);
个人十字军东征
删除MySQL库并将代码移到PDO,你不会回头看。
$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'] ));
更好的方法
考虑将每个注释条目存储在一个单独的表中,该表具有与父“Lead”和创建时间戳的外键关系。 这样,您只需按创建顺序检索所有子注释条目,并简单地插入新条目。
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;