2012-09-01 66 views
0

我创建了一个函数,它不起作用。在盯着它15分钟尝试不同的方式后,我无法实现它的工作。任何人都可以告诉我我的语法有什么问题吗?变量$user_id是一个数字,$input是一个字符串。我知道,mysql已被弃用,这是我正在处理的事情。我只想知道sql有什么问题,因为毕竟它是一个sql问题。语法问题与SQL语句

function insert_what_i_do($user_id, $input) 
{ 
    if (mysql_result(mysql_query("SELECT `user_id` FROM `profile` WHERE `user_id` = $user_id"), 0) !== 1) 
    { 
     mysql_query("INSERT INTO `profile` (user_id, what_i_do) VALUES ($user_id, '$input')");  
    } 
    else 
    { 
     mysql_query("UPDATE `profile` SET `what_i_do` = '$input' WHERE `user_id` = $user_id"); 
    } 
}; 
+0

请,不要使用'mysql_ *'函数来获取新代码。他们不再被维护,社区已经开始[弃用流程](http://goo.gl/KJveJ)。请参阅[**红框**](http://goo.gl/GPmFd)?相反,您应该了解[准备好的语句](http://goo.gl/vn8zQ)并使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli的)。如果你不能决定,[本文](http://goo.gl/3gqF9)将有助于选择。如果你关心学习,[这是一本很好的PDO教程](http://goo.gl/vFWnC)。 – PeeHaa

+1

当你说*不工作*你是什么意思?任何错误? – Fluffeh

+0

那么你得到的错误是什么?它是SELECT,INSERT还是UPDATE? – andrewsi

回答

6

这是用普通MySQL,请取我做什么有一个良好的外观,这是不建议再使用mysql_*功能,因为它们已被弃用。注意引用$input

<?php 
    function insert_what_i_do($user_id, $input) { 
     $input = mysql_real_escape_string($input); 
     $query = mysql_query("SELECT `user_id` FROM `profile` WHERE `user_id` = '".(int)$user_id."'"); 
     $num = mysql_num_rows($query); 
     if($num) { 
      $query = mysql_query("UPDATE `profile` SET `what_i_do` = '".$input."' WHERE `user_id` = '".(int)$user_id."'"); 
     } else { 
      $query = mysql_query("INSERT INTO `profile` (`user_id`, `what_i_do`) VALUES ('".(int)$user_id."', '".$input."')"); 
     } 
    } 
?> 

你需要学会使用PDO:

<?php 
    $db = new PDO('mysql:host=localhost;dbname=testdb;charset=UTF-8', 'username', 'password', array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); 
    function insert_what_i_do($user_id, $input) { 
     global $db; 
     $stmt = $db->query("SELECT `user_id` FROM `profile` WHERE `user_id` = :user_id"); 
     $stmt->execute(array(':user_id' => $user_id)); 
     $num = $stmt->rowCount(); 
     if($num) { 
      $stmt = $db->query("UPDATE `profile` SET `what_i_do` = :input WHERE `user_id` = :user_id"); 
      $stmt->execute(array(':user_id' => $user_id, ':input' => $input)); 
     } else { 
      $stmt = $db->query("INSERT INTO `profile` (`user_id`, `what_i_do`) VALUES (:user_id, :input)"); 
      $stmt->execute(array(':user_id' => $user_id, ':input' => $input)); 
     } 
    } 
?> 
+0

我知道'real_escape_string'问题并计​​划通过mysqli预处理语句和参数化查询来解决此问题。我只想首先找出sql代码有什么问题。 – jason328

1

你似乎已经错过了在更新查询单引号$input

mysql_query("UPDATE `profile` SET `what_i_do` = '$input' WHERE `user_id` = $user_id"); 

但我也不能看到你的任何地方使得的mysql连接。

+0

Mysql连接是在别处进行的。我已经将问题缩小到了功能上。另外,添加单引号仍然不起作用。 – jason328

3

解决PHP的问题后,请注意什么您正在尝试在3个MySQL查询/报表做,可以在一个完成 - 假设user_id是主要或唯一键:

INSERT INTO profile 
    (user_id, what_i_do) 
VALUES 
    ('$user_id', '$input') 
ON DUPLICATE KEY UPDATE 
    what_i_do = VALUES(what_i_do) ;