На самом деле борется с 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 ini_set('display_errors', 'On'); error_reporting(E_ALL); ?> <?php require_once('Connections/cms.php'); ?> <?php if (!function_exists("GetSQLValueString")) { function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") { if (PHP_VERSION < 6) { $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue; } $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue); switch ($theType) { case "text": $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL"; break; case "long": case "int": $theValue = ($theValue != "") ? intval($theValue) : "NULL"; break; case "double": $theValue = ($theValue != "") ? doubleval($theValue) : "NULL"; break; case "date": $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL"; break; case "defined": $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue; break; } return $theValue; } } $editFormAction = $_SERVER['PHP_SELF']; if (isset($_SERVER['QUERY_STRING'])) { $editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']); } if ((isset($_POST["MM_update"])) && ($_POST["MM_update"] == "lead_note_form")) { $updateSQL = sprintf ("UPDATE Leads SET Notes = CONCAT_WS('\n', notes, '%s') WHERE Id=%d", GetSQLValueString($_POST['note'], "text"), GetSQLValueString($_POST['Id'], "int")); mysql_select_db($database_cms, $cms); $Result1 = mysql_query($updateSQL, $cms) or die(mysql_error()); $updateGoTo = "test6.php"; if (isset($_SERVER['QUERY_STRING'])) { $updateGoTo .= (strpos($updateGoTo, '?')) ? "&" : "?"; $updateGoTo .= $_SERVER['QUERY_STRING']; } header(sprintf("Location: %s", $updateGoTo)); } $colname_Recordset1 = "-1"; (isset($_GET['Id'])) { $colname_Recordset1 = $_GET['Id']; } mysql_select_db($database_cms, $cms); $query_Recordset1 = sprintf("SELECT Id, First_Name, Last_Name, Notes FROM Leads WHERE Id = %s", GetSQLValueString($colname_Recordset1, "int")); $Recordset1 = mysql_query($query_Recordset1, $cms) or die(mysql_error()); $row_Recordset1 = mysql_fetch_assoc($Recordset1); $totalRows_Recordset1 = mysql_num_rows($Recordset1); ?> 

HTML

 <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script language="JavaScript" src="jquery.js" type="text/javascript"></script> <script> function clickSubmit() { $("form").submit(); } </script> </head> <body> <table><tr><td> <div id="lead_box"> <form action="<?php echo $editFormAction; ?>" method="POST" name="lead_note_form" id="lead_note_form" target="_top"> <input type="hidden" name="Id" id="Id" value="<?php echo $row_Recordset1['Id']; ?>" /> <table width="100%" border="0" cellpadding="0" cellspacing="5"> <tr> <td colspan="2" bgcolor="#eeeeee"><p align="center" class="name"></p></td> </tr> <tr> <td><textarea rows="15" style="width: 99%" readonly><?php echo $row_Recordset1['Notes']; ?> </textarea></td> </tr> <tr> <td valign="top"><p class="title">Add Note:</p></td> <tr> <td> <textarea name="note" id="note" style="width: 99%" rows="5"></textarea> </td> </tr> </table> <input type="hidden" name="MM_update" value="lead_note_form" /> </form> </div><!-- and of lead box --> </td></tr> <tr><td> <div align="right"> <input type="submit" name="save" id="save" value="Save" onClick="clickSubmit()"/> <input type="button" name="cancel" id="cancel" value="Cancel" onClick="window.parent.hidePopWin()"/> </div> </td></tr></table> </body> </html> <?php mysql_free_result($Recordset1); ?> 

Первое, что я вижу, это ваш sprintf() имеет два параметра замены, но только один заполнитель. Я думаю, вы на самом деле имели в виду

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

Кроме того, ваша GetSQLValueString() автоматически обматывает «текстовые» параметры кавычками, поэтому вам нужно удалить кавычки вокруг заполнителей.

Я также сменил идентификатор-заполнитель на %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;