我正在为我的好友做一个项目,我们想在mysqli中编写数据库调用。我是新手,我只使用了mysql命令,我知道这些命令已经过时了。我一直得到def top_right(size):
line = ''
nsize = size // 2 + 1
out = [""]
line = ""
for num in range(nsize):
line = str(num+1) + line
out.append(line)
return out
def top_left(size):
line = ''
nsize = size // 2
out = []
line = ""
for num in range(nsize):
line += str(num+1)
out.append((nsize-len(line))*' ' + line)
return out
def full_diamond(size):
tl, tr = top_left(size), top_right(size)
for left, right in zip(tl, tr):
print(left+right)
full_diamond(17)
这是我的Call to a member function query() on a non-object on line 30
命令。有谁能请我指出正确的方向吗?我试过在W3学校试一试。这是我的整个代码:
if ($mysqli->query($sql)) {
谢谢!
答案 0 :(得分:4)
这是您的价值中的非对象$_POST[user_image]
,您在其他地方使用$_FILES["user_image"]
,但在您为代码发布的内容中没有任何输入。我们在这里处理文件而不是文本输入。
即:<input type="file" name="user_image">
另外,您需要使用您真正使用的连接变量,如果它是$db
或$mysqli
,并且您已成功连接到数据库,或者选择了正确的数据库和表。
然后这个:
$image_title = addslashes($_REQUEST['user_image']);
您应该使用$_FILES
而不是$_REQUEST
,因为这意味着您可能在未示出的&#34;其他&#34;中使用GET方法。形式。
参考:
参考文献:
并使用适合您的连接的错误处理。请参阅下面的修改。
另外,请确保您要上传的文件夹具有正确的权限才能写入。
将error reporting添加到文件的顶部,这有助于查找错误。
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
// Then the rest of your code
旁注:只应在暂存时进行显示错误,而不是生产。
同样使用var_dump();
,回显和查看HTML源是在调试过程中可以帮助您的其他工具。
附加说明:
如果您希望将该数据作为二进制数据上传到表格中,请确保您使用的是正确的类型。
如TINYBLOB,BLOB,MEDIUMBLOB和LONGBLOB。
另一个&#34;只有你知道&#34; 。
参考:
Matt在评论中指出:
并且$file="uploads/".$_FILES["user_image"];
应更改为$file="uploads/".$_FILES["user_image"]['name'];
将"uploads/" . $_FILES["user_image"]
的实例更改为"uploads/".$_FILES["user_image"]['name']
参考move_uploaded_file()
上的手册:
<强>密码。强>
我注意到您使用MD5作为密码散列函数。此功能不再被认为是安全的。
使用以下其中一项:
crypt()
bcrypt()
scrypt()
password_hash()
功能。其他链接:
关于列长的重要说明:
如果您决定使用password_hash()
或隐藏,请务必注意,如果您当前的密码列长度低于60,则需要将其更改为(或更高)。手册建议长度为255。
您需要更改列的长度并重新开始使用新哈希才能使其生效。否则,MySQL将无声地失败。
修改强>
看到你的另一个问题:
我注意到了PDO语法$row = $stmt->fetch(PDO::FETCH_ASSOC);
以及与mysql_
函数$image = mysql_query...
混合的位置。
这告诉我你可能仍在混合使用MySQL API。如果您的连接是PDO,那么无法混合那些不同的API 。您必须使用相同的连接到查询。
请参阅Stack上的以下内容:
PDO mysql_
- 无效
带有mysqli_
的PDO - 无效
有mysql_
的{{1}} - 无效
答案 1 :(得分:0)
您的代码应该全部面向对象或全部功能。您可以采用面向对象的方式:
$mysqli = new mysqli('dbhost', 'username', 'password', 'dbname');
// ...
$username = $mysqli->escape_string($username);
$password = $mysqli->escape_string($password);
// ...
$mysqli->query($sql);
或功能方式:
$mysqli = mysqli_connect('dbhost', 'username', 'password', 'dbname');
// ...
$username = mysqli_escape_string($mysqli, $username);
$password = mysqli_escape_string($mysqli, $password);
// ...
mysqli_query($mysqli, $sql);
请注意,从PHP 7开始,函数语法已被弃用(我认为,找不到确切的版本)。有关正确使用的信息,请参阅mysqli::_construct
的文档。
同样,mysqli_escape_string()
/ $mysqli->escape_string()
现在是
的别名
$mysqli->real_escape_string()
,因此不再需要使用较长的表单,就像使用旧的mysql
模块一样。
最后,确保您已在代码中实际实例化$mysqli
变量。即使连接失败,也没有理由你应该得到那个特定的错误。