Я знаю, что МНОГО вопросов об этом, и я искал часы для своего решения, и я просто не могу найти, что не так с моим кодом, кроме того, что mysql_query следует изменить на mysqli_query, но когда я его меняю, дает мне еще больше сообщений об ошибках, и я не знаю, что еще попробовать сейчас. Пожалуйста, помогите, если можете, это начинает занимать много времени. БЛАГОДАРЯ! (Не критикуйте, сказав: «Есть так много одинаковых вопросов». Я думаю, что каждый человек заканчивает публикацию своих сообщений, потому что они не могут найти ответ на свою проблему, потому что это не соответствует другим, по крайней мере, в моем случае I посмотрел, прежде чем спрашивать, не добившись успеха.)
// try get "MySQL link identifier" $dbConn = mysql_connect($serverName, $user_name, $password) or die("Cannot connect to server<br />\n MySQL error ==>" . mysql_errno() . "<== : ==>" . mysql_error() . "<== <br />\n"); print ""; // try connect to database mysql_select_db($db_name, $dbConn) or die("Cannot connect to database<br />\n MySQL error ==>" . mysql_errno($dbConn) . "<== : ==>" . mysql_error($dbConn) . "<== <br />\n"); print "<br />\n"; // Retrieve data from database $id = $_GET['id']; $additional_notes = $_GET['additional_notes']; // update data in mysql database $sql=("UPDATE `rmstable2` SET `additional_notes` = '$additional_notes' WHERE `id` = '$id'"); $result = mysql_query($sql) or die(mysql_error()); $resultcount = mysql_affected_rows($result); if ($resultcount == 1) { mysql_query("UPDATE `rmstable2` SET `additional_notes` = '$additional_notes' WHERE `id` = '$id'") or die(mysql_error()); } // if successfully updated. if($result) { echo "Update Successful!"; echo '<h3>Your case has been updated.</h3>'; echo "To see your changes please click <a href='/fullcase.php?id=$id'>here</a></b>"; } else { echo "ERROR"; } ?>
Когда передается запрос UPDATE, mysql_query()
возвращает логический TRUE для успеха и FALSE для отказа, а mysql_num_rows()
принимает только ресурс набора результатов в качестве аргумента. Чтобы определить, сколько строк затронуло запрос UPDATE, вызовите mysql_affected_rows()
с ресурсом соединения в качестве аргумента.
Это не вызывает проблемы, с которыми вы сейчас сталкиваетесь, но вам будет очень or die(mysql_error())
добавить or die(mysql_error())
в mysql_query()
, чтобы уловить любые ошибки MySQL, которые происходят. Вам было бы даже лучше отказаться от функций mysql_*
полностью в пользу расширения PHP PDO, как это рекомендовано в руководстве по PHP, и которое действительно не несет гораздо больше когнитивных накладных расходов в обмен на огромные преимущества, которые он предлагает в возможностях и безопасность.
Оставив это в стороне, вот как я изменил бы свой код, чтобы он больше походил на то, что вы имеете в виду:
<?php // obtain a database connection $dbConn = mysql_connect($serverName, $user_name, $password) or die("Cannot connect to server: " . mysql_error() . "<br />\n"); // mysql error number rarely adds enough information to be worth including // select the database mysql_select_db($db_name, $dbConn) or die("Couldn't select $db_name: " . mysql_error() . "<br />\n"); // obtain escaped versions of query data for inclusion in update query // it is imperative to use mysql_real_escape_string() or equivalent if you're // going to use mysql_* functions instead of the far preferable PDO // prepared statements; if you don't escape your data, you leave open the // possibility of SQL injection, which someone will certainly soon use to // screw up your website horribly $id = mysql_real_escape_string($_GET['id']); $additional_notes = mysql_real_escape_string($_GET['additional_notes']); // assemble query to pass to mysql_query() // no need for parentheses around the string; in fact i'm surprised that // didn't result in a parse error // also FYI re backticks, MySQL uses them to denote literal database/table/ // column names -- they're optional unless required to disambiguate between // an entity name and a reserved word. for example, you can create a table // containing a column named 'key', which is a MySQL reserved word, but you // thereafter must refer to that column as `key`, with backticks, in any // queries, to hint to MySQL's parser that you mean the column by that name // and not the reserved word; otherwise, it's a parse error. $sql = "UPDATE `rmstable2` SET `additional_notes` = '$additional_notes' WHERE `id` = '$id'"; // actually run the query // this being an UPDATE query, the result is boolean and offers no // additional useful information, so you need not capture it in a variable; // the 'or die' clause will fire if it's false, and if it's true, you'll // use mysql_affected_rows() to get the additional info you need. mysql_query($sql) or die(mysql_error()); // if the query failed, the script die()d on the previous line and didn't // get here; if it did get here, you know the query succeeded $resultcount = mysql_affected_rows($dbConn); // this is technically correct but semantically odd; since you already included // the 'additional_notes' value in the previous UPDATE query, and since // that query certainly succeeded if we're evaluating this code at all, // why run the same query again? if ($resultcount == 1) { mysql_query("UPDATE `rmstable2` SET `additional_notes` = '$additional_notes' WHERE `id` = '$id'") or die(mysql_error()); } // again, the 'or die' clauses mean that we can only have reached this point // if the queries succeeded, so there's no need for an if() test here echo "Update Successful!"; echo '<h3>Your case has been updated.</h3>'; // note the backslashes before the embedded double quotes; single quotes in // tag attributes are technically invalid but most browsers will accept them, // but you can use double quotes within a double-quoted string if you precede // the embedded quotes with backslashes (called "escaping") to indicate that // they're not to be taken as the end of the string // (ie, "\"\"" == '""') echo "To see your changes please click <a href=\"/fullcase.php?id=$id\">here</a></b>"; ?>
Александра,
Все, хотя это не решит все ваши ошибки. Он имеет полезные комментарии и поможет вам в нулевом вопросе. Можете ли вы выполнить это и сообщить мне, что вы на самом деле видите?
// try get "MySQL link identifier" $dbConn = mysql_connect($serverName, $user_name, $password) or die("Cannot connect to server<br />\n MySQL error ==>" . mysql_errno() . "<== : ==>" . mysql_error() . "<== <br />\n"); print ""; // try connect to database mysql_select_db($db_name, $dbConn) or die("Cannot connect to database<br />\n MySQL error ==>" . mysql_errno($dbConn) . "<== : ==>" . mysql_error($dbConn) . "<== <br />\n"); print "<br />\n"; // Retrieve data from database $id = $_GET['id']; $additional_notes = $_GET['additional_notes']; // Assuming id is always numeric you could sanitize and validate it like below $id = intval($_GET['id']); if( $id<=0 ){ // Let user know or redirect to a page when id is not present // Or even better do not run the queries at all } // update data in mysql database //$sql=("UPDATE `rmstable2` SET `additional_notes` = '$additional_notes' WHERE `id` = '$id'"); // Escape strings; you could try something like this $sql=("UPDATE `rmstable2` SET `additional_notes` = '" . mysql_escape_string($additional_notes) . "' WHERE `id` = '$id'");
// только для отладки (лучше использовать метод error_log) echo '
SQL: '. $ sql. '
«;
$result = mysql_query($sql); if($result){ //$resultcount = mysql_num_rows($result); // Instead $resultcount = mysql_affected_rows($result); if ($resultcount == 1) { mysql_query("UPDATE `rmstable2` SET `additional_notes` = '$additional_notes' WHERE `id` = '$id'") or die(mysql_error()); }else{ // Nothing was updated // maybe rows didn't match? echo "No data was updated."; } }else{ // mysql_query returned FALSE // There must be an error echo "DB Error: " . mysql_error(); } // if successfully updated. if($result){ echo "Update Successful!"; echo '<h3>Your case has been updated.</h3>'; echo "To see your changes please click <a href='/fullcase.php?id=$id'>here</a></b>"; }else { echo "ERROR"; }