Форма PHP не будет обновлять мою базу данных MySQL - PullRequest
0 голосов
/ 22 сентября 2009

Может кто-нибудь помочь мне исправить этот испорченный код? Он больше не будет обновлять мою базу данных.

DEFINE('DB_USER', 'root');
DEFINE('DB_PASSWORD', '');
DEFINE('DB_HOST', 'localhost');
DEFINE('DB_NAME', 'tags');

if ($dbc = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD)) { 
    if (!mysql_select_db(DB_NAME)) {            
        trigger_error("Could not select the database!\n<br />MySQL Error: " . mysql_error());
        include('./includes/footer.htm');
        exit();             
    } 
} else { // If it couldn't connect to MySQL.
    trigger_error("Could not connect to MySQL!\n<br />MySQL Error: " . mysql_error());
    include('./includes/footer.htm');
    exit();
} // End of $dbc IF.

$tag = mysql_real_escape_string($_POST['tag']);
$query = 'UPDATE tags SET count = count+1 WHERE tag = '.$tag;
mysql_query($query, $dbc);
if (!mysql_affected_rows()) {
    $query = 'INSERT INTO tags (tag, count) VALUES('.$tag.', 1)';
    if (!mysql_query($query,$dbc)) {
        die('Error: ' . mysql_error());
    }
    echo "1 record added";
}

mysql_close($dbc);

Ответы [ 6 ]

6 голосов
/ 22 сентября 2009

Если у вас есть ограничение уникального или первичного ключа для tags.tag, было бы проще сделать это в одном запросе, используя функцию MySQL ON DUPLICATE KEY:

$tag = mysql_real_escape_string($_POST['tag']);
$query = "INSERT INTO tags (tag, count) VALUES ('$tag', 1)
          ON DUPLICATE KEY UPDATE count = count+1";
mysql_query($query, $dbc);

Также обратите внимание, что я сделал с цитатами. Я использую двойные кавычки вокруг строки запроса SQL, что позволяет мне интерполировать переменные PHP непосредственно в строке. Нет необходимости заканчивать строку и объединять ее с "." или чем-то еще.

Затем я использую одинарные кавычки в этом SQL вокруг строковых литералов. Это делает все более читабельным и помогает вам не забывать заключать в кавычки строки в SQL.

PS: при использовании mysql_affected_rows() после ОБНОВЛЕНИЯ следует помнить, что затронутые строки могут быть равны нулю, даже если строка была сопоставлена, поскольку, если обновление не вносит никаких изменений в какие-либо значения, оно не считается как затронутый ряд. То есть попробуйте "UPDATE tags SET count=count;" несмотря на то, что он применяется к каждой строке, он все равно будет сообщать о ноль затронутых строк.

Этот совет не относится к вашему примеру, так как count=count+1 обязан изменить значение. Я просто упоминаю это для вашего будущего использования mysql_affected_rows().

5 голосов
/ 22 сентября 2009

Вы должны прочитать ответы на свой предыдущий вопрос, вы все еще пропускаете кавычки вокруг $ tag в запросах sql.

$query = "UPDATE tags SET count = count+1 WHERE tag = '".$tag."'";

$query = "INSERT INTO tags (tag,count) VALUES('".$tag."',1)';
3 голосов
/ 22 сентября 2009

Да, ответь на эту строку:

$query = 'UPDATE tags SET count = count+1 WHERE tag = '.$tag;

должно читаться так:

$query = "UPDATE tags SET count = count+1 WHERE tag = '".$tag . "'";

Cool.

2 голосов
/ 22 сентября 2009

Первое, что я хотел бы сделать, это удалить всю пользовательскую обработку ошибок, чтобы убедиться, что она действительно подключается. Либо так, либо измените запрос все вместе. Кроме того, обновление до mysqli не может повредить. Поэтому сначала попробуйте изменить соединение:

    DEFINE ('DB_USER', 'root');
    DEFINE ('DB_PASSWORD', '');
    DEFINE ('DB_HOST', 'localhost');
    DEFINE ('DB_NAME', 'tags');

    $dbc = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

    if ($dbc -> connect_error) {
        echo "Could not select the database!\n MySQL Error: ".$dbc -> connect_error;
        include ('./includes/footer.htm');
        exit(); 
    }

Если вы не получили сообщение об ошибке выше, вы подключены. Затем вставьте фиктивный запрос примерно так:

    $test_query = "SELECT * FROM tags WHERE count = 1";
    $test_results = $dbc->query($test_query);

Затем вы можете добавить простую проверку, чтобы перейти к реальному запросу, например:

    if($test_results -> num_rows > 0) {        

    $tag = mysql_real_escape_string($_POST['tag']);
    $update_query = "UPDATE tags SET count = count+1 WHERE tag = '$tag'";
    $dbc -> query($update_query);

Затем выведите ошибку, если она существует для каждого запроса:

    echo ($dbc -> error) ? $dbc -> error : "";

    if($dbc -> affected_rows < 1 ) {
          $insert_query = "INSERT INTO tags (tag,count) VALUES('$tag',1)";
          $dbc -> query($insert_query);
          echo ($dbc -> error) ? $dbc -> error : "1 record added";
       }
    }

    $dbc -> close();
0 голосов
/ 07 июля 2017

$query = 'INSERT INTO tags VALUES('".$tag."', 1)';

Для более короткого запроса

0 голосов
/ 02 июля 2016
$query = "UPDATE tags SET count = count+1 WHERE tag = '".$tag . "'";

Это должно быть наделено!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...