0%

数据库大作业笔记(五)

想给自己鼓个掌嘻嘻嘻~~我好像终于开始学会看错误信息了,最起码,看到满眼的红色错误不是畏惧而是开始找原因了~

目的

我在上一篇笔记中已经写好了mySql中的存储过程,并且现在在mySql中调用该存储过程也没有问题了,现在,我想要通过PHP调用该存储过程。主要是参数的设定不太好处理,需要从表单拿数据,在提交修改的表单之后,会得到:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$_GET = [
'r' => 'category/update',
'id' => 'c1',
];

$_POST = [
'_csrf-backend' => '9ueFt7KZe6r4VcicSw6wY4APsVfqiA8RtZwzfESZSQGFn7XExdozxr8ku9F6PeUk5HaCYKjMS3WB9lcjENIfUw==',
'Category' => [
'catid' => 'c1',
'catname' => '篮球',
'price' => '99',
],
];

$_COOKIE = [
'advanced-backend' => 'pgnho9lendv91620mh8550ev5p',
'_identity-backend' => 'c8280c8419576224c687b72352e3857f7a00c329ecb950cd464196e40ab17045a:2:{i:0;s:17:"_identity-backend";i:1;s:46:"[2,"duWP0ncSYE-Rp1HhKBb8ncPdZULCl7yd",2592000]";}',
'_csrf-backend' => '6e9b91d151f1e7590262068eb1f645cd9440d436961faaefed7c4e0996111199a:2:{i:0;s:13:"_csrf-backend";i:1;s:32:"sx0swCHlGqsM13UGdy37BDDd4jd_TKVR";}',
];

$_SESSION = [
'__flash' => [],
'__returnUrl' => '/yii2/sport_equipment/backend/web/',
'__id' => 2,
];

然后PHP代码中经过判断,调用update()函数,在这里,想要获取catid和price,使用如下语句:

1
2
3
4
5
$Category  = $_POST['Category'];
$tmpcatid=$Category['catid'];
$price=$Category['price'];
var_dump($catname,$price); #查看结果
exit(0);

从得到的结果中看出,我们已经成功获取参数啦~

1
string(2) "c1" string(3) "120"

然后就方便了:

1
2
3
$db = Yii::$app->db;
$db->createCommand("set @p0=$catid,@p0=$price")->execute();
$db->createCommand("call pro_update(@p0,@p1)")->execute();

好吧,问题又来了——catid现在的值是c1,但实际上我应该给@p0的是‘c1’,报错信息:

1
2
3
4
5
6
7
8
9
10
11
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'c1' in 'field list'
The SQL being executed was: set @p0=c1,@p0=99
Error Info: Array
(
[0] => 42S22
[1] => 1054
[2] => Unknown column 'c1' in 'field list'
)

Caused by: PDOException
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'c1' in 'field list'

所以大概是要用到php的字符串连接了

语法:

1
2
3
4
5
6
$s1='i';
$s2=' love ';
$s3='u';
$s4=$s1.$s2.$s3.$s4;

$catid="'".$tmpcatid."'";

最后的问题在于,我发现这句话没有起作用哇…这可如何是好,留到明天解决吧…至少这个command在MySQL里的执行是没有问题的了,大概是要换一种PHP的写法哦(Path:common\models\Category.php)

1
$db->createCommand("SET @p0=$catid; SET @p1=$price; CALL `proc_update`(@p0, @p1);")->execute();

试了另外一种方法,还是不行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

$Category = $_POST['Category'];
$tmpcatid=$Category['catid'];
$price=$Category['price'];

$catid="'".$tmpcatid."'";

// $conn = mysqli_connect('localhost','root','') or die("MYSQL_connect:".mysql_errno());
// $query = "SET @p0=$catid; SET @p1=$price; CALL `proc_update`(@p0, @p1);";
// $query_e = explode(';','$query');
// foreach ($query_e as $k =>$v)
// {
// mysqli_query($conn,$query_e[$k]);
// }

// $db = Yii::$app->db;
// $db->createCommand("SET @p0=$catid; SET @p1=$price; CALL `proc_update`(@p0, @p1);")->execute();

未解….

作为补偿,在这里记一下PHP中单引号和双引号的区别:

PHP中单引号和双引号的区别

在PHP中,字符串的定义可以使用英文单引号’ ‘,也可以使用英文双引号” “。一般情况下两者通用的。但双引号内部变量会解析,单引号则不解析。双引号中的变量($var)和特殊字符(\r\n之类)会被转义。单引号中的内容不会被转义,总被认为是普通字符,因此效率更高。

1
2
3
$str='hello';
echo "str is $str"; //运行结果: str is hello
echo 'str is $str'; //运行结果: str is str

看颜色也就能看出区别吧。